如何从多个类中的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();
答案 0 :(得分:1)
关闭连接会释放连接资源,请参阅here并始终关闭连接。根据DataSource实现(例如连接池),它可以例如在下一个getConnection调用时返回相同的连接。但它不必这样做,它也可以终止第一个连接并每次返回一个新连接。
答案 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