gpt4 book ai didi

java - 是否有必要为每个连接从 JNDI 获取一个新的数据源?

转载 作者:行者123 更新时间:2023-11-30 06:23:36 26 4
gpt4 key购买 nike

查看高信誉用户的答案,例如 this看来换个新的DataSource合适通过在每个连接请求上查询 JNDI 命名服务来获取对象。例如。代码如下(为简洁起见,改编自链接答案):

public class ConnectionManager{
public static Connection getConnection() throws NamingException {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource dataSource = (DataSource)envContext.lookup("jdbc/test");
return dataSource.getConnection();
}
}

这真的是建议/惯用的方式吗?在我自己的一些“ConnectionManager”实用程序类中,我曾经将对 DataSource 对象的引用保留为实例变量。除了当 JBoss 管理员从管理控制台禁用并启用连接池时,我的代码出现如下错误:

java.sql.SQLException: javax.resource.ResourceException: IJ000451: The connection manager is shutdown

那么,在 JDBC 中保留 DataSource 对象的实例是一种反模式吗?

最佳答案

DataSource 对象可以被缓存并且是线程安全的,尽管 JNDI 应该进行足够的优化,使得每个请求从 JNDI 中获取 DS 的情况可以忽略不计(相同的实例将从 JNDI 传回)。

例如,如果您在 Java EE 环境中工作,则能够在类级别注入(inject)数据源是规范标准,例如:

public class MyServlet extends HttpServlet {

@Resource
DataSource ds;

public void processRequest() {
try(Connection con = ds.getConnection()) {
// ...
}
}

}

此外,跨多个线程共享 DataSource 对象是完全安全的。另一方面,跨多个线程共享 Connection 对象是一个很大的错误,因为根据规范这些对象不是线程安全的。

关于java - 是否有必要为每个连接从 JNDI 获取一个新的数据源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47661169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com