我正在尝试找出连接池的最佳结构,以便我可以从任何 servlet 访问连接池并建立与我的数据库的连接。我一直在关注一些关于设置和配置数据源和连接池的教程,它们都在扩展 HttpServlet 的类中初始化和访问它们。所以它看起来像这样:
public class DatabaseConnector extends HttpServlet {
private static final long serialVersionUID = 1L;
private DataSource dataSource;
private Connection connection;
private Statement statement;
public void init() throws ServletException {
try {
// Get DataSource
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
dataSource = (DataSource)envContext.lookup("jdbc/test");
} catch (NamingException e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#HttpServlet()
*/
public DatabaseConnector() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ResultSet resultSet = null;
try {
// Get Connection and Statement
connection = dataSource.getConnection();
statement = connection.createStatement();
String query = "SELECT * FROM STUDENT";
resultSet = statement.executeQuery(query);
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + resultSet.getString(2) + resultSet.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if (resultSet != null) {resultSet.close();}
if (statement != null) {statement.close();}
if (connection != null) {connection.close();}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
在我看来,此连接池仅适用于此 servlet,它只会在通过此 servlet URL 发送 get 请求时分发连接。如果我想要另一个需要访问数据库的 servlet 怎么办。我正在考虑只删除此 servlet 中的 doGet 和 doPost 方法并保留 init 以便在运行时初始化连接池,然后对该 servlet 进行单例引用,该引用可用于其他 servlet。但是,这对我来说似乎不是正确的方法。构建可从所有 servlet 和监听器访问的连接池的最佳方法是什么?
感谢您的帮助!
最佳答案
完全错了。
访问连接的正确方法是使用 JNDI connection pool .
Servlet 是 HTTP 监听器。它们不应该与数据库有任何关系。
适当分层的 Java EE 解决方案会将数据源限制在服务层。它将检查进出连接,了解工作单元和事务,并与数据访问对象交互。
Servlet 应该处理服务,而不是数据源。
关于java - Java EE 连接池的最佳结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18817763/