Java代码  收藏代码

  1. 这篇文章是在网上摘的、以前面试的时候问过我这样的问题“说说为什么通过thin方式连接数据库”,今×××索的时候偶然间发现了、就摘下来了、以后好看看  

Java代码  收藏代码

  1. 在J2EE应用程序开发中,应用程序与数据库连接的建立是我们经常遇到的问题之一。在这里我主要谈谈在本地应用程序中通过OCI方式、thin方式和JdbcOdbc桥方式连接Oracle数据库,在iPlanet Application Server 6.5和Sun Java System Application Server 7中对Oracle数据库连接池的配置以及应用中如何从连接池中获得连接   

  2.   

  3. 一、本地通过JDBC获得Oracle数据库连接   

  4.   

  5. 通过JDBC获得Oracle数据库连接,有三种方式:OCI方式、thin方式和JdbcOdbc桥方式。OCI方式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采用该方式;而thin方式为纯java的数据库连接方式;JdbcOdbc桥方式依赖于本地ODBC数据库源的配置,这种方式一般不太被采用。   

  6.   

  7. 1、OCI方式   

  8.   

  9. 先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip文件,我们在环境变量classpath中设置classes12.zip所在的路径。   

  10.   

  11. 然后通过以下的数据库连接类,在本地通过OCI方式获得Oracle数据库连接   

  12.   

  13. /**  

  14. * 在本地获得数据库连接  

  15. */   

  16.   

  17. package com.j2ee.db;   

  18.   

  19. import java.util.*;   

  20. import java.sql.*;   

  21. import javax.sql.*;   

  22. import java.io.*;   

  23. import oracle.jdbc.driver.*;   

  24. import javax.naming.*;   

  25.   

  26. /**  

  27. * 通过OCI方式获得Oracle数据库连接  

  28. */   

  29. public class DbConnection   

  30. {   

  31. final static String sDBDriver = "oracle.jdbc.driver.OracleDriver";   

  32. final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199";   

  33.   

  34. /**  

  35.  

  36. */   

  37. public DbConnection()   

  38. {   

  39. }   

  40.   

  41. /**  

  42. * 获得Oracle数据库连接  

  43. */   

  44. public java.sql.Connection connectDbByOci()   

  45. {   

  46. java.sql.Connection conn=null;   

  47. try   

  48. {   

  49. Class.forName(sDBDriver);   

  50. conn = DriverManager.getConnection(sConnStr);   

  51. }   

  52. catch (Exception e)   

  53. {   

  54. System.out.println("ERROR:"+e.getMessage());   

  55. }   

  56. return conn;   

  57. }   

  58. }   

  59. 在连接字符串 "jdbc:oracle:oci8:sr/sr@ora199" 中,"sr/sr"为Oracle用户的用户名和口令,"ora199"为数据库服务名。   

  60.   

  61. 2、thin方式   

  62.   

  63. 先到Oracle技术网(http://otn.oracle.com/global/cn/software/tech/java/sqlj_jdbc/index.html)下载Oracle JDBC Drivers,同样地将下载后的zip文件的路径设置在环境变量classpath。   

  64.   

  65. 然后通过以下的数据库连接类,在本地通过thin方式获得Oracle数据库连接。   

  66.   

  67. /**  

  68. * 在本地获得数据库连接  

  69. */   

  70.   

  71. package com.j2ee.db;   

  72.   

  73. import java.util.*;   

  74. import java.sql.*;   

  75. import javax.sql.*;   

  76. import java.io.*;   

  77. import oracle.jdbc.driver.*;   

  78. import javax.naming.*;   

  79.   

  80. /**  

  81. * 通过thin方式获得Oracle数据库连接  

  82. */   

  83. public class DbConnection   

  84. {   

  85. private String sConnStr = "";   

  86.   

  87. /**  

  88. * 缺省构造器  

  89. */   

  90. public DbConnection()   

  91. {   

  92. sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199";   

  93. }   

  94.   

  95. /**  

  96. * @param ip,serviceName  

  97. */   

  98. public DbConnection(String ip,String serviceName)   

  99. {   

  100. sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName;   

  101. }   

  102.   

  103. /**  

  104. * 通过thin方式获得Oracle数据库的连接.  

  105. */   

  106. public java.sql.Connection connectDbByThin()   

  107. {   

  108. java.sql.Connection conn=null;   

  109. try   

  110. {   

  111. Class.forName(sDBDriver);   

  112. conn = DriverManager.getConnection(sConnStr,"sr","sr");   

  113. }   

  114. catch (Exception e)   

  115. {   

  116. System.out.println("ERROR:"+e.getMessage());   

  117. }   

  118. return conn;   

  119. }   

  120.   

  121. /** 

  122.  

  123. * 通过thin方式获得Oracle数据库的连接.  

  124. * @param userId,password  

  125. */   

  126. public java.sql.Connection connectByJdbc(String userId,String password)   

  127. {   

  128. java.sql.Connection conn=null;   

  129. try   

  130. {   

  131. Class.forName(sDBDriver);   

  132. conn = DriverManager.getConnection(sConnStr,userId,password);   

  133. }   

  134. catch (Exception e)   

  135. {   

  136. System.out.println("ERROR:"+e.getMessage());   

  137. }   

  138. return conn;   

  139. }   

  140. }   

  141. 这种方式运用起来比较灵活,简单,具有较强的移植性和适用性。只要注意连接字符串"jdbc:oracle:thin:@10.1.4.199:1521:ora199"中具体参数的设置即可   

  142.   

  143. 3、JdbcOdbc桥方式   

  144.   

  145. 先通过管理工具中的数据源来添加本地对Oracle数据库的连接,然后通过以下的数据库连接类,在本地通过JdbcOdbc桥方式获得Oracle数据库连接。   

  146.   

  147. /**  

  148. * 在本地获得数据库连接  

  149. */   

  150.   

  151. package com.j2ee.db;   

  152.   

  153. import java.util.*;   

  154. import java.sql.*;   

  155. import javax.sql.*;   

  156. import java.io.*;   

  157. import oracle.jdbc.driver.*;   

  158. import javax.naming.*;   

  159.   

  160. /**  

  161. * 通过JdbcOdbc桥方式获得Oracle数据库连接  

  162. */   

  163. public class DbConnection   

  164. {   

  165. /**  

  166.  

  167. */   

  168. public DbConnection()   

  169. {   

  170. }   

  171.   

  172. /**  

  173. * 获得Oracle数据库连接  

  174. */   

  175. public java.sql.Connection connectDbByJdbcOdbcBridge()   

  176. {   

  177. java.sql.Connection conn=null;   

  178. try   

  179. {   

  180. Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");   

  181. con=DriverManager.getConnection("jdbc:odbc:ora199","sr","sr");   

  182. }   

  183. catch (Exception e)   

  184. {   

  185. System.out.println("ERROR:"+e.getMessage());   

  186. }   

  187. return conn;   

  188. }   

  189. }   

  190. 在getConnection方法中第一个参数"jdbc:odbc:ora199" 中的"ora199"为本地ODBC数据源的数据源名称,第二个参数和第三个参数分别为Oracle的用户名和口令。   

  191.   

  192. 二、通过连接池获得Oracle数据库连接   

  193.   

  194. 这部分主要讲述在iPlanet Application Server 6.5和Sun Java System Application Server 7中Oracle数据库连接池的配置,以及在应用中如何通过连接池获得数据库的连接。   

  195.   

  196. 1、iPlanet Application Server 6.5连接池的配置   

  197.   

  198. 先打开iPlanet Application Server 6.5的管理控制台,选中"database"面板,再选择"External JDBC Drivers"选项后,点击"Add…"按钮,在弹出的对话框中,添加一个名为"ora-type4"的JDBC Driver。   

  199.   

  200.   

  201. Driver Classpath:该参数填写classes12.zip文件的物理路径。   

  202.   

  203. 然后在"External JDBC DataSources"中选择"Add…",在弹出的对话框中添加一个JNDI名称为"credit2"的数据源。   

  204.   

  205.   

  206. DriverType:选择刚添加好的"ora-type4";   

  207.   

  208. Datasource:ora199,为Oracle数据库服务名;   

  209.   

  210. Datasource:ora199,为Oracle数据库服务名;   

  211.   

  212. Connection Pool Parameters:图中显示的是缺省设置,可以根据自己环境情况来更改这些设置。  

  213.   

  214. 保存完设置后,在"DataSource Selection Box"中,选择刚添加的"credit2"数据源,再选择"Vendor Specific Properties"按钮。在对话中添加一个URL属性。   

  215.   

  216.   

  217. 至此,iPlanet Application Server 6.5中的数据库连接池配置完毕,重起服务使之生效。   

  218.   

  219. 2、Sun Java System Application Server 7连接池的配置   

  220.   

  221. 在配置之前将classes12.zip文件置于…/server1/lib目录下。通过浏览器的4848端口打开Sun Java System Application Server 7的管理界面,选择"server1"->"JDBC"-> "Connection Pools"下的"New…"   

  222.   

  223.   

  224. 添加一个名称为"MyConnectionPool"的Oracle数据库连接池。"Next"下一步。   

  225.   

  226.   

  227. "General"中填写"Datasource Classname"。   

  228.   

  229.   

  230. "Properties"中将不需要的属性删除,同时添加"URL"属性。   

  231.   

  232. "dataSourceName"中填写Oracle数据库服务名。   

  233.   

  234. 以下连接池的缺省设置,可以根据自己环境的情况作相应的调整。  

  235.   

  236. 选择"Finish"完成连接池的设置。   

  237.   

  238. 下一步为"MyConnectionPool"连接池创建一个JNDI,以便应用程序能够通过该名称获得连接池中的连接。 "server1"->"JDBC"-> "JDBC Resources"下的"New…"   

  239.   

  240.   

  241. 至此,Sun Java System Application Server7中的数据库连接池配置完毕,重起服务使之生效。   

  242.   

  243. 3、通过连接池获得连接   

  244.   

  245. 以上在iPlanet Application Server 6.5和Sun Java System Application Server7中配置的连接池都可以通过以下的数据库连接类,从连接池中获得Oracle数据库连接。   

  246.   

  247. /**  

  248. * 从连接池中获得数据库连接  

  249. */   

  250.   

  251. package com.j2ee.db;   

  252.   

  253. import java.util.*;   

  254. import java.sql.*;   

  255. import javax.sql.*;   

  256. import java.io.*;   

  257. import oracle.jdbc.driver.*;   

  258. import javax.naming.*;   

  259.   

  260. /**  

  261. * 通过连接池方式获得Oracle数据库连接  

  262. */   

  263. public class DbConnection   

  264. {   

  265. /**  

  266.  

  267. */   

  268. public DbConnection()   

  269. {   

  270. }   

  271.   

  272. /**  

  273. * 获得Oracle数据库连接  

  274. */   

  275. public java.sql.Connection connectDbByConnectionPool()   

  276. {   

  277. java.sql.Connection conn=null;   

  278. try   

  279. {   

  280. Context ctx = new InitialContext();   

  281. DataSource ds = (DataSource)ctx.lookup("jdbc/credit2");   

  282. conn=ds.getConnection();   

  283. }   

  284. catch (Exception e)   

  285. {   

  286. System.out.println("ERROR:"+e.getMessage());   

  287. }   

  288. return conn;   

  289. }   

  290. }   

  291. 4、使用连接池的优点使用连接池的优点主要体现在两个方面:对数据库的连接统一进行配置、管理、监控,以及对数据库连接池的参数进行优化调整,  

  292. 同时对应用中没有关闭或其他原因造成没有关闭的数据库连接由连接池统一进行管理。便于应用的移植和后端数据库的切换,  

  293. 因为在应用中通过统一的JNDI获得数据库的连接,而具体连接的是哪一台机器上的数据库与应用无关