gpt4 book ai didi

java - 初始化数据库连接对象一次并重用它 - jboss

转载 作者:行者123 更新时间:2023-12-02 07:47:37 24 4
gpt4 key购买 nike

我使用jboss服务器和postgresql作为数据库。现在我每次都在 servlet 中连接到数据库,如下所示:

public void doPost(HttpServletRequest req, HttpServletResponse resp)
{
Connection conn =null; // Create connection object
String database = "jbossdb"; // Name of database
String user = "qwerty"; //
String password = "qwerty";
String url = "jdbc:postgresql://localhost:5432/" + database;
ResultSet rs = null;
ResultSetMetaData rsm = null;
ObjectInputStream in=new ObjectInputStream(req.getInputStream());
String input=(String) in.readObject();
String[] s_input=input.split(",");

try{
Class.forName("org.postgresql.Driver").newInstance();
//.newInstance()
} catch(Exception e)
{
System.err.println(e);
}

try{
conn = DriverManager.getConnection(url, user, password);

}catch(SQLException se)
{
System.err.println(se);
}

此代码存在于我的每个服务器中。对于每个请求,都会创建一个新的连接对象。这会影响性能吗? jboss中有什么方法可以只初始化一次连接(可能在启动时),然后在需要时传递给servlet?我应该把它放在 servlet 的 init() 方法中吗?

最佳答案

您在这里遇到的可能不是一个好的解决方案。当您使用 servlet 来执行应用程序加载的操作时,您可以拥有监听器。你要做的是,首先创建一个实现 ServletContextListener 的类.

public class ContextListener implements ServletContextListener {

public void contextInitialized(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
String dburl=context.getInitParameter("dbUrl");
String dbusername=context.getInitParameter("dbUserName");
String dbpassword=context.getInitParameter("dbPassword");

DBConnector.createConnection(dburl, dbusername, dbpassword);
System.out.println("Connection Establised.........");
}

public void contextDestroyed(ServletContextEvent sce) {
DBConnector.closeConnection();
}

}

之后,您可以创建另一个类来在应用程序加载时创建连接。

public class DBConnector {

private static Connection con;

public static void createConnection(String dbUrl,String dbusername,String dbPassword){
try {
Class.forName("org.postgresql.Driver");
con=DriverManager.getConnection(dbUrl, dbusername, dbPassword);
} catch (Exception ex) {
ex.printStackTrace();
}
}

public static Connection getConnection(){
return con;
}

public static void closeConnection(){
if(con!=null){
try {
con.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}

}



}

然后,当您想要获取数据库连接时,您可以调用静态 getConnection 方法并获取它。为了调用您的监听器类,您必须在 web.xml 中添加监听器标记。

<context-param>
<param-name>dbUrl</param-name>
<param-value>jdbc:postgresql://localhost:5432/jbossdb</param-value>
</context-param>
<context-param>
<param-name>dbUserName</param-name>
<param-value>qwerty</param-value>
</context-param>
<context-param>
<param-name>dbPassword</param-name>
<param-value>qwerty</param-value>
</context-param>
<listener>
<listener-class>com.icbt.bookstore.listener.ContextListener</listener-class>
</listener>

对数据库用户名和密码进行硬编码并不是一个好习惯。相反,您可以在 web.xml 中使用 servlet 初始化参数,如下所示。

希望这能回答您的问题。

关于java - 初始化数据库连接对象一次并重用它 - jboss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598409/

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