程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> JavaEE 6中新的定義數據源方法

JavaEE 6中新的定義數據源方法

編輯:J2EE

在JavaEE應用程序中,數據源對象(DataSource objects)是通過JDBC API訪問關系數據庫的途徑。每個DataSource對象都有一系列用來描述現實世界中數據源的屬性,通過這些屬性可以描述數據庫服務器所在的地址、數據庫名稱、網絡協議等信息。另外數據源對象還可以與JNDI配合使用,如果將一個數據源與一個注冊好的JNDI服務綁定後,在應用程序中就可以通過訪問JNDI API得到這個數據源對象,進而取得和數據庫的鏈接以及進行數據庫操作。

在JavaEE 6以前,數據源的定義和使用與Java應用服務器廠家有很強的相關性,JavaEE 6則提供了更為靈活的數據源定義方式,可以定義在多個應用服務器之間兼容的數據源。另外同時支持注釋、聲明、部署表述等多個定義方式。在本文中,將說明如何使用注釋和或部署描述來定義數據源。

使用注釋定義數據源

在JavaEE 6中提供了兩個用來定義數據源的注釋標記:@DataSourceDefinition 和@DataSourceDefinitions,這兩個標記都位於Javax.annotation.sql包中。通過@DataSourceDefinition可以定義單個數據源,通過@DataSourceDefinitions可以定義多個數據源。

@DataSourceDefinition注釋

@DataSourceDefinition注釋標記可以應用客戶端、Servlet、EJB等元件當中定義數據源,通過該注釋標記,可以定義數據源對象,並與JNDK綁定。該標記的使用方式與設置數據源對象的屬性沒有什麼區別,也可以設置附加信息以及特定信息。

例如,下面的注釋標記創建了一個訪問Derby數據庫的數據源。

  1. @DataSourceDefinition(name = "Java:app/env/Servlet_DataSource",
  2. minPoolSize = 0,
  3. initialPoolSize = 0,
  4. className = "org.apache.derby.jdbc.ClIEntXADataSource",
  5. user = "APP",
  6. passWord = "APP",
  7. databaseName = "testdb",
  8. propertIEs = {"connectionAttributes=;create=true"}
  9. )

數據源的name屬性值就是要綁定的的JNDI名稱,根據JNDI的特點,該值應該是唯一的。從上面的例子中可以注意到,屬性值的第一部分,也就是java:app是一個命名空間說明。在JavaEE 6中引入了應用元件命名空間,目前可以使用的命名空間如下:

Java:comp,同一應用同一容器中的元件可以訪問。

Java:module,與元件相同的一個模塊中可以訪問,比如定義在同一個ejb-jar.XML中的EJB元件。

Java:app,可以在同一應用中的所有元件和模塊中訪問,例如位於統一ear文件中的客戶端元件、WEB元件、EJB元件。

Java:global,可以在服務器中所有的應用程序之間共享。

name屬性所引用的命名空間范圍,也決定了數據源對象的訪問范圍,也就是模塊、應用或者同一服務中的所有用用。以下的定義方式分別表示:

Java:comp/env/, 與數據源定義元件處於同一容器中的其他元件、如客戶端元件、WEB元件、EJB元件都可以訪問這個數據源。

Java:module/env/, 位於同一個ejb-jar.XML中的元件都可以訪問這個數據源。

Java:app/env/, 同一個應用中的所有元件,如EJB, servlet以及客戶端元件都可以訪問這個數據源。

@DataSourceDefinitions注釋

通過@DataSourceDefinitions可以在一個元件類中創建多個數據源,就如同定義一個數組一樣,每個數據源是數組的一個元素。下面是一個為EJB定義多個數據源的例子。

  1. @DataSourceDefinitions(
  2. value = {
  3. @DataSourceDefinition(name = "Java:app/env/HelloStatefulEJB_DataSource",
  4. minPoolSize = 0,
  5. initialPoolSize = 0,
  6. className = "org.apache.derby.jdbc.ClIEntXADataSource",
  7. portNumber = 1527,
  8. serverName = "localhost",
  9. user = "APP",
  10. passWord = "APP",
  11. databaseName = "testdb",
  12. propertIEs = {"connectionAttributes=;create=true"}
  13. ),
  14. @DataSourceDefinition(name = "Java:comp/env/HelloStatefulEJB_DataSource",
  15. minPoolSize = 0,
  16. initialPoolSize = 0,
  17. className = "org.apache.derby.jdbc.ClIEntXADataSource",
  18. portNumber = 1527,
  19. serverName = "localhost",
  20. user = "APP",
  21. passWord = "APP",
  22. databaseName = "testdb",
  23. propertIEs = {"connectionAttributes=;create=true"}
  24. )
  25. }
  26. )
  27. @Stateful
  28. public class HelloStatefulEJB implements HelloStateful {
  29. ...
  30. ...
  31. }

采用部署表述定義數據源

除了前面的方式以外,JavaEE 6還繼續支持使用部署描述的方式定義數據源,部署描述信息可以寫在application.xml、application-clIEnt.xml、web.xml以及ejb-jar.XML當中。下面的例子中定義的數據源與前面使用@DataSourceDefinition數據源含義相同。

  1. <data-source>
  2. <name>Java:app/env/Application_Level_DataSource</name>
  3. <class-name>org.apache.derby.jdbc.ClIEntXADataSource</class-name>
  4. <server-name>localhost</server-name>
  5. <port-number>1527</port-number>
  6. <database-name>testdb</database-name>
  7. <user>APP</user>
  8. <passWord>APP</passWord>
  9. <property>
  10. <name>connectionAttributes</name>
  11. <value>;create=true</value>
  12. </property>
  13. </data-source>

如果在同一個應用程序中,分別通過@DataSourceDefinition和部署描述信息定義了兩個數據源,但這這兩個數據源具有相同的name屬性。如果發證這樣的情況,采用部署描述定義的數據源優先權高於采用注釋聲明定義的數據源。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved