[英]what is the best practice to close connection when dealing with jdbc
我正在使用prepareStatement()
防止SQL注入。 我現在遇到的問題是,使用下面的方法,我可以執行getConnection().prepareStatement()
然后構建我的查詢,但是我需要嘗試捕獲對getConnection()
每個調用,並在finally
塊中將其關閉。 createStatement().execute()
似乎更好,因為我可以讓客戶端傳遞查詢,然后在一個地方處理try-catch-finally,但這不會阻止sql注入。 通常最佳做法是什么? 還是有其他方法來構建可以防止SQL注入的查詢?
private static Connection getConnection() throws SQLException, URISyntaxException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath();
return DriverManager.getConnection(dbUrl, username, password);
}
我會使用連接池,而不是每次都創建連接並關閉。
我們應該遵循幾個步驟來使用tomcat服務器創建連接池
第1步。 使用數據庫連接詳細信息更新TOMCAT_ROOT_DIR \\ conf \\ server.xml文件,如下所示:
<?xml version='1.0' encoding='utf-8'?>
...
<GlobalNamingResources>
...
<Resource name="jdbc/JCGExampleDB"
global="jdbc/JCGExampleDB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
username="test"
password="test"
driverClassName="com.mysql.jdbc.Driver"
description="JCG Example MySQL database."
url="jdbc:mysql://localhost:3306/JCGExampleDB"
maxTotal="10"
maxIdle="10"
maxWaitMillis="10000"
removeAbandonedTimeout="300"
defaultAutoCommit="true" />
...
</GlobalNamingResources>
步驟-2:使用Spring的JdbcTemplate-您可以編寫數據庫連接實用程序類並按如下所示獲得連接(此步驟可以通過多種方式來完成。例如context.xml文件或web.xml文件或如下所示)
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
@Bean
public DataSource dataSource() {
DataSource dataSource = new com.mchange.v2.c3p0.ComboPooledDataSource();
try {
JndiTemplate jndiTemplate = new JndiTemplate();
dataSource = (DataSource)jndiTemplate.lookup("java:comp/env/jdbc/JCGExampleDB");
} catch (NamingException e) {
log.error("Unable to configure datasource: " + e.getStackTrace());
}
return dataSource;
}
Edit1:使用Singleton類-不使用JdbcTemplate:可以在需要時從Singleton類獲取連接。
public class DatabaseConnectionManager {
DataSource ds;
public void init() {
InitialContext initialContext = new InitialContext();
ds = (javax.sql.DataSource)initialContext.lookup("jdbc/JCGExampleDB");
}
public Connection getConnection() {
if(ds == null) init();
return ds.getConnection();
}
}
希望這可以幫助...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.