我有一个网络应用程序。我已经使用Jersey实现了REST Web服务。所以我的控制器是Jersey ServletContainer servlet,它被打包在jar中。 现在让我假设我有许多客户连接到我的应用程序并通过API端点从数据库获取数据。 我希望有一个全局连接池,我的每个客户都可以从这里获得连接,我可以减少连接创建开销。 所以,我想把它放到控制器servlet的 init()或 contextInitialized()方法中,但是我不能这样做,因为jersey控制器已经是作为类文件打包在jersey jar内。所以我通过在GenericConnection类中创建一个静态块来实现代码,该类负责创建上下文和数据源,这样我每次都不会创建上下文。
public class GenericConnection {
static DataSource dataSource;
Connection con;
static {
try{
System.out.println("1 and thats all");
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/moodoff_notificationRead_DB");
}
catch(Exception ee){
ee.printStackTrace();
}
}
// Get a connection from the connection pool
public Connection getNewConnection(){
try {
con = dataSource.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
}
但我不确定是否每个用户请求都会创建一个全局池并可以从那里共享连接。 我故意创建了一个静态块并将所有内容放在其中,以便只初始化一次。 它真的能帮助我达到我想要的目标吗?如果有任何其他调整,我可以做到这一点。 在此先感谢!!
答案 0 :(得分:1)
如果您在容器中运行,则可能是您已在使用连接池。只需确保使用合理的最大连接数正确设置(并且您的数据库可以支持该数字)。
您不应该编写自己的池化机制,即使在容器外也是如此。