簡體   English   中英

處理jdbc時關閉連接的最佳實踐是什么

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM