javaee中共享数据库连接
我正在使用JSP和Servlet(IDE:Eclipse,数据库:Oracle10)开发一个web应用程序 我开发了一个java类,它返回一个javaee中共享数据库连接,java,connection,Java,Connection,我正在使用JSP和Servlet(IDE:Eclipse,数据库:Oracle10)开发一个web应用程序 我开发了一个java类,它返回一个静态连接,这个连接将被我的整个web应用程序使用 public class DBConnection { private static Connection con = null; static Connection getConnection(String str) { try {
静态连接
,这个连接将被我的整个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类
获取数据。因此,在这4个类中,我得到了在我的DBConnection
类中创建的连接,这4个类也工作得很好。这四个类用于我的所有Servlet
为了在这4门课上取得联系,我写了以下几行:
private static Connection con = DBConnection.getConnection("UpdateQuery.java");
但问题是,我想在所有四个类中共享相同的连接,但在这四个类中分别创建了连接。那么,我应该如何在这四个类中共享相同的连接呢?有更好的方法吗?如果我使用这种方法,web应用程序会因为共享整个应用程序的连接而出现任何问题吗?您应该将创建的连接实例保存到DBConnection
中的一个私有静态字段中,当调用getConnection时,检查字段是否为空,然后创建连接,然后返回它:
if(连接==null){
connection=createConnection();
}
回路连接代码>
其中,connection
是DBConnection类的私有静态连接
字段
但是,我强烈建议不要使用此方法,因为在并发线程之间共享连接将导致严重问题。我建议使用看起来你想把连接
转换成一个单例,但是忘记检查它是否已经被实例化了。在getConnection
中,您可以首先检查con
是否不为null,然后立即返回该实例。只有当con
仍然为空时,才能继续初始化。您正在(隐式地)尝试解决一个非常重要的任务
这些事情通常是由容器完成的——从池中获取连接,然后将它们返回,重新连接等等
如果您使用功能齐全的应用程序服务器,则最好配置和使用数据源
如果您的服务器不支持数据源,请不要将连接保存到私有字段中。例如,当你失去联系时会发生什么?您的私有变量将具有非工作连接。你有什么恢复机制吗
如果您在业务操作开始时获得代码,然后关闭它,那么您的代码将更加健壮
或者尝试寻找一个专业编写的支持连接池的库——它在处理连接池方面的作用与经典容器几乎相同
或者自己编写,但这将是一项单独的任务,有很多问题。你想这样做的原因是什么?@DanielKaplan因为我想在我的web应用程序中共享相同的连接,而不是为每个servlet创建单独的连接,而我对java是新手,所以我只知道这种方法,但是如果你能提出任何比这更好的方法,我将不胜感激。如果所有共享的都用完了,可以共享一些并创建新的。您应该研究连接池。通常情况下,库会为您处理此问题。+1建议连接池
,我将很快更新我的代码,因为每个人都建议这样做。