激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - JDBC數(shù)據(jù)源連接池配置及應(yīng)用

JDBC數(shù)據(jù)源連接池配置及應(yīng)用

2020-05-15 11:01kingxss JAVA教程

這篇文章主要介紹JDBC建立數(shù)據(jù)庫連接的兩種方式,使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,效率更高,推薦使用,希望能給大家做一個參考。

使用JDBC建立數(shù)據(jù)庫連接的兩種方式:

1.在代碼中使用DriverManager獲得數(shù)據(jù)庫連接。這種方式效率低,并且其性能、可靠性和穩(wěn)定性隨著用戶訪問量得增加逐漸下降。

2.使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,該方式其實質(zhì)就是在上述方法的基礎(chǔ)上增加了數(shù)據(jù)庫連接池,這種方式效率高。

數(shù)據(jù)源連接池的方式連接數(shù)據(jù)庫與在代碼中使用DriverManager獲得數(shù)據(jù)庫連接存在如下差別:

1)數(shù)據(jù)源連接池的方式連接數(shù)據(jù)庫是在程序中,通過向一個JNDI(Java Naming and  Directory Interface)服務(wù)器查詢,即調(diào)用Context接口的lookup()方法,來得到DataSource對象,然后調(diào)用DataSource對象的getConnection()方法建立連接

2)為了能重復(fù)利用數(shù)據(jù)庫連接對象,提高對請求的響應(yīng)時間和服務(wù)器的性能,采用連接池技術(shù).連接池技術(shù)預(yù)先建立多個數(shù)據(jù)庫連接對象,然后將連接對象保存到連接池中,當客戶請求到來時,從池中取出一個連接對象為客戶服務(wù),當請求完成時,客戶程序調(diào)用close()方法,將連接對象放回池中.

3)在代碼中使用DriverManager獲得數(shù)據(jù)庫連接的方式中,客戶程序得到的連接對象是物理連接,調(diào)用連接對象的close()方法將關(guān)閉連接,而采用連接池技術(shù),客戶程序得到的連接對象是連接池中物理連接的一個句柄,調(diào)用連接對象的close()方法,物理連接并沒有關(guān)閉,數(shù)據(jù)源的實現(xiàn)只是刪除了客戶程序中的連接對象和池中的連接對象之間的聯(lián)系.

為了測試方便可以在數(shù)據(jù)庫(這里以mysql 5為例)中建立一個USER表:

?
1
2
3
4
5
6
7
CREATE TABLE `user` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `username` varchar(50) DEFAULT NULL,
 `password` varchar(50) DEFAULT NULL,
 `email` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`),
);

導(dǎo)入數(shù)據(jù)庫的驅(qū)動的jar包到tomcat的lib目錄下(這里以mysql5為例,所用到的jar包為:mysql-connector-java-5.0.8-bin.jar)。

1.在代碼中使用DriverManager獲得數(shù)據(jù)庫連接。這種方式效率低,并且其性能、可靠性和穩(wěn)定性隨著用戶訪問量得增加逐漸下降。

oracle數(shù)據(jù)庫連接的Java代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import java.sql.Connection;
import java.sql.DriverManager;
/**
 * 獲取數(shù)據(jù)庫連接
 */
public class DBConnection {
  
 /** Oracle數(shù)據(jù)庫連接URL*/
 private final static String DB_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
  
 /** Oracle數(shù)據(jù)庫連接驅(qū)動*/
 private final static String DB_DRIVER = "oracle.jdbc.driver.OracleDriver";
  
 /** 數(shù)據(jù)庫用戶名*/
 private final static String DB_USERNAME = "root";
  
 /** 數(shù)據(jù)庫密碼*/
 private final static String DB_PASSWORD = "admin";
  
 /**
  * 獲取數(shù)據(jù)庫連接
  * @return
  */
 public Connection getConnection(){
  /** 聲明Connection連接對象*/
  Connection conn = null;
  try{
   /** 使用Class.forName()方法自動創(chuàng)建這個驅(qū)動程序的實例且自動調(diào)用DriverManager來注冊它*/
   Class.forName(DB_DRIVER);
   /** 通過DriverManager的getConnection()方法獲取數(shù)據(jù)庫連接*/
   conn = DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD);
  }catch(Exception ex){
   ex.printStackTrace();
  }
  return conn;
 }
  
 /**
  * 關(guān)閉數(shù)據(jù)庫連接
  *
  * @param connect
  */
 public void closeConnection(Connection conn){
  try{
   if(conn!=null){
    /** 判斷當前連接連接對象如果沒有被關(guān)閉就調(diào)用關(guān)閉方法*/
    if(!conn.isClosed()){
     conn.close();
    }
   }
  }catch(Exception ex){
   ex.printStackTrace();
  }
 }
  
}

mysql數(shù)據(jù)庫連接的JSP代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<%@page import="java.sql.*, com.mysql.jdbc.Driver"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body> 
 <%
 //com.mysql.jdbc.Driver
 Class.forName(Driver.class.getName()).newInstance();
 String url = "jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF8";
 String user = "root";
 String password = "123";
  
 Connection conn = DriverManager.getConnection(url, user, password);
 Statement stmt = conn.createStatement();
  
 String sql = "select * from user";
 ResultSet rs = stmt.executeQuery(sql);
  
 while(rs.next()) {
  out.print("<br />" + "====================" + "<br />");
  out.print(rs.getLong("id") + " ");
  out.print(rs.getString("username") + " ");
  out.print(rs.getString("password") + " ");
  out.print(rs.getString("email") + " ");
 }
 %>
</body>
</html>

2.使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,該方式其實質(zhì)就是在上述方法的基礎(chǔ)上增加了數(shù)據(jù)庫連接池,這種方式效率高。

1)mysql數(shù)據(jù)庫數(shù)據(jù)源連接池的JSP代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<%@page import="java.sql.*, javax.naming.*, javax.sql.DataSource"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
 <%
 Context initCtx = new InitialContext();
 DataSource ds = (DataSource)initCtx.lookup("java:comp/env/jdbc/demoDB");
 Connection conn = ds.getConnection();
  
 Statement stmt = conn.createStatement();
  
 String sql = "select * from user";
 ResultSet rs = stmt.executeQuery(sql);
  
 while(rs.next()) {
  out.print("<br />" + "====================" + "<br />");
  out.print(rs.getLong("id") + " ");
  out.print(rs.getString("username") + " ");
  out.print(rs.getString("password") + " ");
  out.print(rs.getString("email") + " ");
 }
 %>
</body>
</html>

2) 添加如下代碼到tomcat的conf目錄下的server.xml中:

?
1
2
3
4
5
6
7
8
9
10
11
<Context>
 <Resource name="jdbc/demoDB" auth="Container"
 type="javax.sql.DataSource"
 driverClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/demo"
 username="root"
 password="123"
 maxActive="50"
 maxIdle="30"
 maxWait="10000" />
</Context>

3)在web工程目錄下的web.xml的根節(jié)點下配置如下內(nèi)容:

?
1
2
3
4
5
6
<resource-ref>
 <description>mysqlDB Connection</description>
 <res-ref-name>jdbc/demoDB</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

完成上述步驟數(shù)據(jù)源的連接池配置已經(jīng)完成,但是為了提高項目的可移植性,最好將上述第二步的內(nèi)容放入到工程的META-INF目錄的context.xml中(這個文件需要自行建立):

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/demoDB" auth="Container"
  type="javax.sql.DataSource"
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/demo"
  username="root"
  password="123"
  maxActive="50"
  maxIdle="30"
  maxWait="10000" />
</Context>

3.使用配置數(shù)據(jù)源的數(shù)據(jù)庫連接池時的數(shù)據(jù)庫操作工具類

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package db.utils;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
//import org.apache.log4j.Logger;
 
/**
 * 數(shù)據(jù)庫操作輔助類
 */
public class DbUtils {
  
 //private static Logger logger = Logger.getLogger("DbUtils");
  
 /**
  * 該語句必須是一個 SQL INSERT、UPDATE 或 DELETE 語句
  * @param sql
  * @param paramList:參數(shù),與SQL語句中的占位符一一對應(yīng)
  * @return
  * @throws Exception
  */
 public int execute(String sql, List<Object> paramList) throws Exception {
  if(sql == null || sql.trim().equals("")) {
   //logger.info("parameter is valid!");
  }
 
  Connection conn = null;
  PreparedStatement pstmt = null;
  int result = 0;
  try {
   conn = getConnection();
   pstmt = DbUtils.getPreparedStatement(conn, sql);
   setPreparedStatementParam(pstmt, paramList);
   if(pstmt == null) {
    return -1;
   }
   result = pstmt.executeUpdate();
  } catch (Exception e) {
   //logger.info(e.getMessage());
   throw new Exception(e);
  } finally {
   closeStatement(pstmt);
   closeConn(conn);
  }
 
  return result;
 }
  
 /**
  * 將查詢數(shù)據(jù)庫獲得的結(jié)果集轉(zhuǎn)換為Map對象
  * @param sql:查詢語句
  * @param paramList:參數(shù)
  * @return
  */
 public List<Map<String, Object>> getQueryList(String sql, List<Object> paramList) throws Exception {
  if(sql == null || sql.trim().equals("")) {
   //logger.info("parameter is valid!");
   return null;
  }
 
  Connection conn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List<Map<String, Object>> queryList = null;
  try {
   conn = getConnection();
   pstmt = DbUtils.getPreparedStatement(conn, sql);
   setPreparedStatementParam(pstmt, paramList);
   if(pstmt == null) {
    return null;
   }
   rs = getResultSet(pstmt);
   queryList = getQueryList(rs);
  } catch (RuntimeException e) {
   //logger.info(e.getMessage());
   System.out.println("parameter is valid!");
   throw new Exception(e);
  } finally {
   closeResultSet(rs);
   closeStatement(pstmt);
   closeConn(conn);
  }
  return queryList;
 }
  
 private void setPreparedStatementParam(PreparedStatement pstmt, List<Object> paramList) throws Exception {
  if(pstmt == null || paramList == null || paramList.isEmpty()) {
   return;
  }
  DateFormat df = DateFormat.getDateTimeInstance();
  for (int i = 0; i < paramList.size(); i++) {
   if(paramList.get(i) instanceof Integer) {
    int paramValue = ((Integer)paramList.get(i)).intValue();
    pstmt.setInt(i+1, paramValue);
   } else if(paramList.get(i) instanceof Float) {
    float paramValue = ((Float)paramList.get(i)).floatValue();
    pstmt.setFloat(i+1, paramValue);
   } else if(paramList.get(i) instanceof Double) {
    double paramValue = ((Double)paramList.get(i)).doubleValue();
    pstmt.setDouble(i+1, paramValue);
   } else if(paramList.get(i) instanceof Date) {
    pstmt.setString(i+1, df.format((Date)paramList.get(i)));
   } else if(paramList.get(i) instanceof Long) {
    long paramValue = ((Long)paramList.get(i)).longValue();
    pstmt.setLong(i+1, paramValue);
   } else if(paramList.get(i) instanceof String) {
    pstmt.setString(i+1, (String)paramList.get(i));
   }
  }
  return;
 }
  
 /**
  * 獲得數(shù)據(jù)庫連接
  * @return
  * @throws Exception
  */
 private Connection getConnection() throws Exception {
  InitialContext cxt = new InitialContext();
  DataSource ds = (DataSource) cxt.lookup(jndiName);
  if ( ds == null ) {
   throw new Exception("Data source not found!");
  }
   
  return ds.getConnection();
 }
  
 private static PreparedStatement getPreparedStatement(Connection conn, String sql) throws Exception {
  if(conn == null || sql == null || sql.trim().equals("")) {
   return null;
  }
  PreparedStatement pstmt = conn.prepareStatement(sql.trim());
  return pstmt;
 }
  
 /**
  * 獲得數(shù)據(jù)庫查詢結(jié)果集
  * @param pstmt
  * @return
  * @throws Exception
  */
 private ResultSet getResultSet(PreparedStatement pstmt) throws Exception {
  if(pstmt == null) {
   return null;
  }
  ResultSet rs = pstmt.executeQuery();
  return rs;
 }
  
 /**
  * @param rs
  * @return
  * @throws Exception
  */
 private List<Map<String, Object>> getQueryList(ResultSet rs) throws Exception {
  if(rs == null) {
   return null;
  }
  ResultSetMetaData rsMetaData = rs.getMetaData();
  int columnCount = rsMetaData.getColumnCount();
  List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
  while (rs.next()) {
   Map<String, Object> dataMap = new HashMap<String, Object>();
   for (int i = 0; i < columnCount; i++) {
    dataMap.put(rsMetaData.getColumnName(i+1), rs.getObject(i+1));
   }
   dataList.add(dataMap);
  }
  return dataList;
 }
  
 /**
  * 關(guān)閉數(shù)據(jù)庫連接
  * @param conn
  */
 private void closeConn(Connection conn) {
  if(conn == null) {
   return;
  }
  try {
   conn.close();
  } catch (SQLException e) {
   //logger.info(e.getMessage());
  }
 }
  
 /**
  * 關(guān)閉
  * @param stmt
  */
 private void closeStatement(Statement stmt) {
  if(stmt == null) {
   return;
  }
  try {
   stmt.close();
  } catch (SQLException e) {
   //logger.info(e.getMessage());
  }
 }
  
 /**
  * 關(guān)閉
  * @param rs
  */
 private void closeResultSet(ResultSet rs) {
  if(rs == null) {
   return;
  }
  try {
   rs.close();
  } catch (SQLException e) {
   //logger.info(e.getMessage());
  }
 }
  
  
 private String jndiName = "java:/comp/env/jdbc/demoDB";
 
 public void setJndiName(String jndiName) {
  this.jndiName = jndiName;
 }
}

總結(jié):使用配置數(shù)據(jù)源的方式連接數(shù)據(jù)庫,這種方式效率高且性能穩(wěn)定,推薦使用。查看更多Java的語法,希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青青国产在线视频 | 久久精品性视频 | 我爱我色成人网 | 特级黄色影院 | 精品久久久久久久久久久久久久 | 国产精品免费看 | 精品无码久久久久久国产 | 欧美色大成网站www永久男同 | 色婷婷久久久亚洲一区二区三区 | 亚洲午夜免费 | 天天夜干| av在线免费播放 | 高清在线国产 | 精品在线视频观看 | 国产成人精品网站 | 毛片118极品美女写真 | 欧美日韩免费在线观看视频 | 精精国产xxxx视频在线野外 | 久草在线视频网 | 国产一区免费观看 | 亚洲网站免费 | 久久αv | 久久人人爽人人爽人人片av高请 | 午夜色视频在线观看 | 日韩av影片在线观看 | 亚洲特黄妇女高潮 | 91av99| 久久国产精品成人免费网站 | 久久99免费观看 | 羞羞视频免费网站含羞草 | 久久av喷吹av高潮av懂色 | 成人在线视频网 | 日韩电影一区二区三区 | 成人免费乱码大片a毛片视频网站 | 吾色视频 | 亚洲国产精品久久久久婷婷老年 | 亚洲国产视频网 | 成人在线观看免费 | 午夜国产在线观看 | 免费观看视频在线观看 | 久久精品一区二区三区国产主播 |