我正在使用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类
来自数据库using the above connection
的数据。所以在这4个类中,我得到了在DBConnection
类中创建的连接,这四个类也正常工作。这四个类在我的所有Servlet中使用。
要在这4个类中获取Connection,我将按照以下行编写:
private static Connection con = DBConnection.getConnection("UpdateQuery.java");
但问题是我想在所有四个类中共享相同的连接,但是在这4个类中单独创建连接。那么我应该如何在这四个类中共享相同的连接呢?有更好的方法吗?如果我使用这种方法,由于共享整个应用程序的连接,Web应用程序中是否会出现任何问题?
答案 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