如何从多个类中的DataSource获得相同的连接?

时间:2015-03-11 22:17:03

标签: java datasource

如何从多个类中的DataSource获取相同的连接?有可能吗?

假设我有一个DataSource,我将其传递给2个类。 DataSource正在使用连接池。

然后我调用1st Class中的一个方法,它从DataSource获取一个Connection,使用该Connection然后关闭该Connection。

然后我调用第二类中的方法从DataSource获取连接,使用该连接然后关闭该连接。

是否可以确定第2类中的方法将获得第1类中方法使用的相同连接?

这是示例代码:

这是第一个类,其方法将由工作单元调用:

public class Class1 {
   private DataSource dataSource = null;

   public Class1(DataSource dataSource) {
      this.dataSource = dataSource;
   }

   public void class1Method1() throws Exception {
      Connection conn = null;
      try {
         conn = dataSource.getConnection();
         ... // do your work
      } finally {
         try {
            if (conn != null)
               conn.close();
         } catch (Exception e) {            
         } finally {
            conn = null;
         }
      }
   }
}

这是第二个类,其方法将由工作单元调用:

public class Class2 {
   private DataSource dataSource = null;

   public Class2(DataSource dataSource) {
      this.dataSource = dataSource;
   }

   public void class2Method1() throws Exception {
      Connection conn = null;
      try {
         conn = dataSource.getConnection();
         ... // do your work
      } finally {
         try {
            if (conn != null)
               conn.close();
         } catch (Exception e) {            
         } finally {
            conn = null;
         }
      }
   }
}

这是我的工作单位:

InitialContext initialContext = null;
DataSource dataSource = null;
Class1 class1 = null;
Class2 class2 = null;

initialContext = new InitialContext();
dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/MyDB");
class1 = new Class1(dataSource);
class2 = new Class2(dataSource);
class1.class1Method1();
class2.class2Method1();

2 个答案:

答案 0 :(得分:1)

关闭连接会释放连接资源,请参阅here并始终关闭连接。根据DataSource实现(例如连接池),它可以例如在下一个getConnection调用时返回相同的连接。但它不必这样做,它也可以终止第一个连接并每次返回一个新连接。

有关详细信息,请参阅herehere

答案 1 :(得分:1)

正如@EJP在评论中所说,在你关闭它之前,你需要将Connection传递给另一个类。如果您打算稍后在外部类中使用它,您还需要确保第二个类不会关闭它。这是一个低级别的解决方案,非常令人头痛。

您可以使用Spring或Java EE在更高级别解决此问题。它可以让你标记所有相关的方法来说明,"这些应该是交易的"。如果您是第一次呼叫一个,则启动新事务。当您离开该外部方法时,事务将自动结束。但是,如果该方法调用另一个事务方法,它知道事务仍然是打开的,所以它重用它。它消除了很多头痛。

我相信这两种技术在幕后使用面向方面编程。

了解更多JEE:http://docs.oracle.com/javaee/6/tutorial/doc/bncih.html

了解更多Spring:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html