在Java EE中共享数据库连接

时间:2013-01-21 07:04:52

标签: java connection

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

我开发了一个返回static connection的java类,该连接将由我的整个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. 选择
  5. 来自数据库using the above connection的数据。所以在这4个类中,我得到了在DBConnection类中创建的连接,这四个类也正常工作。这四个类在我的所有Servlet中使用。

    要在这4个类中获取Connection,我将按照以下行编写:

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

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

3 个答案:

答案 0 :(得分:2)

你(隐含地)试图解决一个非平凡的任务。

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

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

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

如果您在业务操作开始时获取代码然后将其关闭,那么您的代码将更加强大。

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

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

答案 1 :(得分:1)

看起来你想把Connection变成单身,但是忘了检查它是否已经被实例化了。在getConnection中,您可以首先检查con是否为空,然后立即返回该实例。仅当con仍为空时,才进行初始化。

答案 2 :(得分:0)

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

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

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