1

我正在使用 JSP 和 Servlet(IDE:Eclipse,数据库:Oracle10)开发一个 Web 应用程序。

我开发了返回 a 的 java 类,static connection我的整个 Web 应用程序都将使用该连接。

public class DBConnection 
{
    private static Connection con = null;

    static Connection getConnection(String str)
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            con = DriverManager.getConnection("MyValuesHere");
            System.out.println("New instance of Connection is created for: "+str);
        }
        catch(ClassNotFoundException cnfe)
        {
            System.out.println("Error loading class!");
            cnfe.printStackTrace();
        }
        catch(SQLException sqle)
        {
            System.out.println("Error connecting to the database!");
            sqle.printStackTrace();
        }
        return con;
    }//getConnection()
}//class

以上课程工作正常。然后我还有另外 4 个 java 类

  1. 插入
  2. 更新
  3. 删除
  4. 选择

来自数据库的数据using the above connection。因此,在这 4 个课程中,我获得了在我的DBConnection课程中创建的连接,并且这四个课程也运行良好。这四个类在我所有的 Servlet 中都用到了。

为了在这 4 个类中获得连接,我正在编写以下行:

private static Connection con = DBConnection.getConnection("UpdateQuery.java");

但问题是我想在所有四个类中共享相同的连接,但连接是在这 4 个类中单独创建的。那么我应该如何在这四个类中共享相同的连接呢?有更好的方法吗?如果我使用这种方法,Web 应用程序是否会因为共享整个应用程序的连接而出现任何问题?

4

3 回答 3

2

您正在(隐含地)尝试解决一项重要的任务。

这些事情通常由容器完成 - 从池中获取连接,然后将它们返回,重新连接等......

如果您使用功能齐全的应用程序服务器,您最好配置和使用数据源。

如果您的服务器不支持数据源,请不要将连接保存到私有字段中。例如,当您的连接丢失时会发生什么?您的私有变量将具有非工作连接。有没有恢复机制?

如果您在业务操作开始时获得它然后关闭它,您的代码将更加健壮。

或者尝试找到一个支持连接池的专业编写的库——它在处理连接池方面与经典容器几乎相同。

或者自己写,但这将是一个有很多问题的单独任务。

于 2013-01-21T08:00:50.290 回答
1

看起来你想Connection变成一个单例,但后来忘记检查它是否已经被实例化了。getConnection您可以首先检查 if conis not null 并立即返回该实例。仅当con仍然为空时,才继续初始化。

于 2013-01-21T07:13:41.710 回答
0

您应该将创建的连接实例保存到 中的私有静态字段中DBConnection,并在调用 getConnection 时检查该字段是否为空,然后创建连接,然后返回它: if (connection == null) { connection = createConnection(); } return connection;

其中connection是 DBConnection 类的一个private static Connection connection字段。

但是我强烈建议不要使用这种方法,因为在并发线程之间共享连接会导致严重的问题。我建议使用连接池

于 2013-01-21T07:13:15.393 回答