我一直在搜索高低,並收集了點點滴滴,如果已經在其他地方已經回答了道歉,但我無法找到它。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())....
一切似乎都工作,所以讓我確認我的理解這裏:
因爲我使用的是Tomcat 8.5,所以我不需要指定單獨的web.xml。正確嗎?
當我以這種方式連接時,Azure會自動創建池。池中的連接數量等不能(不需要?)配置。
在我意識到需要訪問數據庫的其他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()中查找數據源並存儲在一個私有變量中會更好?
感謝
感謝彼得,我讀過這和有沒有問題,通過JNDI訪問,但一些配置參數我用諸如大小在聯繫Azure端時池似乎不被接受,這讓我認爲Azure會自動管理池?否則,爲什麼不從Tomcat中最大化連接池的大小呢? – fobius