Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaee中共享数据库连接_Java_Connection - Fatal编程技术网

javaee中共享数据库连接

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 {

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

我开发了一个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类

  • 插入
  • 更新
  • 删除
  • 挑选
  • 使用上述连接从数据库
    获取数据
    。因此,在这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建议
    连接池
    ,我将很快更新我的代码,因为每个人都建议这样做。