第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在池中關(guān)閉JDBC連接

在池中關(guān)閉JDBC連接

慕蓋茨4494581 2019-10-15 09:58:43
我們使用JDBC的標(biāo)準(zhǔn)代碼部分是...Connection conn = getConnection(...);Statement  stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,                                                ResultSet.CONCUR_READ_ONLY);ResultSet  rset = stmt.executeQuery (sqlQuery);// do stuff with rsetrset.close(); stmt.close(); conn.close();問題1:使用連接池時,是否應(yīng)該在最后關(guān)閉連接?如果是這樣,合并的目的就不會丟失嗎?如果不是,那么DataSource如何知道何時釋放Connection的特定實例并可以重用?我對此感到有些困惑,任何指針都表示贊賞。問題2:以下方法是否接近標(biāo)準(zhǔn)?看起來像是嘗試從池中獲取連接,并且如果無法建立DataSource,請使用老式的DriverManager。我們甚至不確定哪個部分在運行時執(zhí)行。重復(fù)以上問題,是否應(yīng)該關(guān)閉這種方法產(chǎn)生的連接?謝謝-MSsynchronized public Connection getConnection (boolean pooledConnection)                                                        throws SQLException {        if (pooledConnection) {                if (ds == null) {                        try {                                Context envCtx = (Context)                                        new InitialContext().lookup("java:comp/env");                                ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");                                return ds.getConnection();                        } catch (NamingException e) {                                e.printStackTrace();                }}                return (ds == null) ? getConnection (false) : ds.getConnection();        }        return DriverManager.getConnection(                "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);}編輯:我認(rèn)為我們正在得到池連接,因為我們沒有看到堆棧跟蹤。
查看完整描述

3 回答

?
慕桂英546537

TA貢獻(xiàn)1848條經(jīng)驗 獲得超10個贊

使用連接池時,應(yīng)該最后關(guān)閉連接嗎?如果是這樣,合并的目的就不會丟失嗎?如果不是,那么DataSource如何知道何時釋放Connection的特定實例并可以重用?我對此感到有些困惑,任何指針都表示贊賞。


是的,當(dāng)然您也需要關(guān)閉池化連接。實際上,它是圍繞實際連接的包裝。它會在幕后將實際連接釋放回池中。由池進(jìn)一步?jīng)Q定實際的連接是實際上是關(guān)閉還是重新用于新getConnection()呼叫。因此,無論是否使用連接池,都應(yīng)始終以相反的順序在獲取它們finally的try塊中關(guān)閉所有JDBC資源。在Java 7中,可以通過使用try-with-resourcesstatement 進(jìn)一步簡化此操作。


以下方法是否接近標(biāo)準(zhǔn)?看起來像是嘗試從池中獲取連接,并且如果無法建立DataSource,請使用老式的DriverManager。我們甚至不確定哪個部分在運行時執(zhí)行。重復(fù)以上問題,是否應(yīng)該關(guān)閉這種方法產(chǎn)生的連接?


這個例子很嚇人。您只需要DataSource在應(yīng)用程序啟動期間在整個應(yīng)用程序級數(shù)據(jù)庫配置類的某些構(gòu)造函數(shù)/初始化中查找/初始化一次。然后,只需getConnection()在應(yīng)用程序的整個生命周期中調(diào)用一個相同的數(shù)據(jù)源即可。不需要同步也不需要nullcheck。


查看完整回答
反對 回復(fù) 2019-10-15
?
梵蒂岡之花

TA貢獻(xiàn)1900條經(jīng)驗 獲得超5個贊

池通常返回包裝的Connection對象,在該對象中將覆蓋close()方法,通常將Connection返回到池。調(diào)用close()可以,并且可能仍然需要。


close()方法可能如下所示:


public void close() throws SQLException {

  pool.returnConnection(this);

}

對于第二個問題,您可以添加一個記錄器以顯示底部是否運行過。我可以想象,盡管您只希望一種或另一種方式來配置數(shù)據(jù)庫連接。我們僅將池用于數(shù)據(jù)庫訪問。無論哪種方式,關(guān)閉連接對于防止泄漏都是非常重要的。


查看完整回答
反對 回復(fù) 2019-10-15
?
冉冉說

TA貢獻(xiàn)1877條經(jīng)驗 獲得超1個贊

實際上,連接管理的最佳方法是不要將它們植入任何地方的任何代碼中。


創(chuàng)建一個SQLExecutor類,該類是打開和關(guān)閉連接的唯一位置。


然后,應(yīng)用程序的其余部分將語句泵送到執(zhí)行程序中,而不是從池中獲取連接并在各處進(jìn)行管理(或管理不當(dāng))。


您可以根據(jù)需要擁有任意數(shù)量的執(zhí)行程序?qū)嵗?,但是沒有人可以編寫自己代表打開和關(guān)閉連接的代碼。


方便地,這還使您可以從一組代碼中記錄所有SQL。


查看完整回答
反對 回復(fù) 2019-10-15
  • 3 回答
  • 0 關(guān)注
  • 519 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號