Java 如何为web服务建立连接池

Java 如何为web服务建立连接池,java,web-services,jakarta-ee,jersey,database-connection,Java,Web Services,Jakarta Ee,Jersey,Database Connection,作为先例,我是通过在线教程学习Java的,所以,请不要对我的问题太苛刻,如果我在这里问这个问题,只是因为我不知道在哪里可以找到答案 我需要编写一些简单的web服务,所以我开始研究并找到了Jersey库,它暂时解决了我的问题。主要的问题是每次我想访问数据库时,我都需要打开一个连接,所以我研究了连接池 @Path ("login") @Singleton public class LoginWS{ private DataSource dataSource; private Connection

作为先例,我是通过在线教程学习Java的,所以,请不要对我的问题太苛刻,如果我在这里问这个问题,只是因为我不知道在哪里可以找到答案

我需要编写一些简单的web服务,所以我开始研究并找到了Jersey库,它暂时解决了我的问题。主要的问题是每次我想访问数据库时,我都需要打开一个连接,所以我研究了连接池

@Path ("login")
@Singleton
public class LoginWS{

private DataSource dataSource;
private Connection connection;
private Statement statement;

public LoginWS (){
    try {
        Context initContext  = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        dataSource = (DataSource)envContext.lookup("jdbc/testdb");
    } catch (NamingException e) {
        e.printStackTrace();
    }       
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String authUser(@HeaderParam(value = "data") String data) {
    Gson parser = new Gson();
    LoginInput user = parser.fromJson(data, LoginInput.class);
    LoginOutput response = new LoginOutput();

    try {
        connection = dataSource.getConnection();
        statement = connection.createStatement();

        // Here I do the DB queries, and logic

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        try { if(null!=resultSet)resultSet.close();} catch (SQLException e) 
        {e.printStackTrace();}
        try { if(null!=statement)statement.close();} catch (SQLException e) 
        {e.printStackTrace();}
        try { if(null!=connection)connection.close();} catch (SQLException e) 
        {e.printStackTrace();}
    }
    return parser.toJson(response);
}
}
正如您所看到的,我需要在需要构建的每个其他类中使用一个新的连接池,我不知道这是否是一个好的实践。所以我想建立一些类似于:

public Connection getDBConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}
所以它会要求连接池的连接,所以我的所有web服务都使用相同的池。我尝试了另一个在JSON对象中返回连接的Web服务,但是,我认为任何知道WS在哪里的人都可以访问我的数据库,它是。。。至少可以说是不可取的

然后我阅读了一个名为HttpServlet的对象,并构建了如下内容:

public class TestServlet extends HttpServlet {

private static final long serialVersionUID = 1L; // No idea about this. Eclipse's suggestion
private DataSource dataSource;

public void init() throws ServletException {
    try {
        Context initContext  = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        dataSource = (DataSource)envContext.lookup("jdbc/testdb"); 
        System.out.println("Connection Pool: set");                 
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

public Connection getDBConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
    }
}
立即购买,我不知道如何从我的Web服务中调用此实例

老实说。。。我找不到什么了


提前感谢您阅读本文。

如果您目前正在使用Tomcat,明智的选择是将您的开发转移到Glassfish或其他Java Enterprise Edition服务器。Tomcat只是一个Servlet/JSP引擎,而Glassfish是一个完整的JavaEE套件,它不仅包括Servlet/JSP和Jersey,还包括您正在寻找的连接池

下面是众多教程之一,向您展示了在Glassfish中设置连接池是多么容易:


您使用的是哪台服务器?因为像JBoss和Glassfish JDBC这样的“完整”EE服务器中的afaik资源已经被appserver汇集了?一定要研究一下您正在使用的EE服务器。大多数已经提供了设置和使用连接池的功能。如果不是,除非你想学,否则不要写你自己的。有很多连接池库,你可以直接使用。我使用的是Tomcat。谢谢链接断了我很抱歉链接没能保存七年。也许您可以通过另一种方式找到关于如何在Glassfish中设置连接池的教程。