2016-12-14 103 views
0

我一直在搜索高低,並收集了點點滴滴,如果已經在其他地方已經回答了道歉,但我無法找到它。SQL Azure和連接池

我正在用Tomcat和SQL Azure在後端編寫一個Java應用程序。

有多個servlet訪問SQL Azure數據庫。我想使用連接池通過Tomcat作爲管理8.5

在META-INF我的應用程序的context.xml如下:

 <Context> 

    <Resource name="jdbc/sqlazure" 
    auth="Container" 
    driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
    type="javax.sql.DataSource" 
    maxIdle="30" 
    username="[username]" 
    password="[password]" 
    url="jdbc:sqlserver://[database]:1433;database=BackInfo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30" 
    removeAbandonedTimeout="30" 
    logAbandoned="true" /> 

</Context> 

在Java代碼中,我訪問的典型方式:

InitialContext ic = new InitialContext();ds = (DataSource)ic.lookup("java:comp/env/jdbc/sqlazure"); 

嘗試(連接CON = ds.getConnection())....

一切似乎都工作,所以讓我確認我的理解這裏:

  1. 因爲我使用的是Tomcat 8.5,所以我不需要指定單獨的web.xml。正確嗎?

  2. 當我以這種方式連接時,Azure會自動創建池。池中的連接數量等不能(不需要?)配置。

  3. 在我意識到需要訪問數據庫的其他servlet之前,我有一個servlet通過SQLServerConnectionPoolDataSource直接創建數據源並從那裏獲取連接。該文件指出:

SQLServerConnectionPoolDataSource通常在支持內置的連接池和要求的ConnectionPoolDataSource提供物理連接,如Java平臺企業版(Java EE)應用程序的Java應用服務器環境中使用提供JDBC 3.0 API規範連接池的服務器。

  • 這是否意味着當我使用SQLServerConnectionPoolDataSource直接要求一個連接時,它會檢查是否Tomcat的支持池,然後基本上用JDBC機制來創建的池由Tomcat管理的SQL Azure連接?

  • 當通過Tomcat JNDI查找獲取數據源時,使用context.xml中指定的SQLServerDriver。當Web應用程序啓動時,它將檢查context.xml並使用SQLServerDriver連接到SQL Azure,檢查是否支持池,如果是,那麼Tomcat正在使用該驅動程序自動創建它返回的連接池數據源?

  • 我也只是想到了另一個問題。有一個Singleton DataSource類返回對池連接數據源的引用是否有意義,還是讓每個servlet在其init()中查找數據源並存儲在一個私有變量中會更好?

  • 感謝

    回答

    0

    根據我的理解,SQL Server的JDBC連接池是通過Java應用程序創建的,不天青一樣。我的建議是,您需要參考下面的Tomcat官方文檔來了解JNDI資源& JDBC DataSource。

    1. JNDI資源:http://tomcat.apache.org/tomcat-8.5-doc/jndi-resources-howto.html
    2. JDBC數據源:http://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html
    +0

    感謝彼得,我讀過這和有沒有問題,通過JNDI訪問,但一些配置參數我用諸如大小在聯繫Azure端時池似乎不被接受,這讓我認爲Azure會自動管理池?否則,爲什麼不從Tomcat中最大化連接池的大小呢? – fobius