最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring 數(shù)據(jù)庫(kù)連接池(JDBC)詳解

 更新時(shí)間:2017年05月02日 14:41:20   作者:五月的倉(cāng)頡  
本篇文章主要介紹了基于Spring的JDBC基本框架搭建;基于Spring的JDBC增刪改查;讀取配置文件中的數(shù)據(jù)等,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧

數(shù)據(jù)庫(kù)連接池

對(duì)一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)應(yīng)用,由于對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)不是很頻繁,這時(shí)可以簡(jiǎn)單地在需要訪問(wèn)數(shù)據(jù)庫(kù)時(shí),就新創(chuàng)建一個(gè)連接,就完后就關(guān)閉它,這樣做也不會(huì)帶來(lái)什么性能上的開銷。但是對(duì)于一個(gè)復(fù)雜的數(shù)據(jù)庫(kù)應(yīng)用,情況就完全不同而,頻繁的建立、關(guān)閉連接,會(huì)極大地減低系統(tǒng)的性能,因?yàn)閷?duì)于連接的使用成了系統(tǒng)性能的瓶頸。

通過(guò)建立一個(gè)數(shù)據(jù)庫(kù)連接池以及一套連接使用管理策略,可以達(dá)到連接復(fù)用的效果,使得一個(gè)數(shù)據(jù)庫(kù)連接可以得到安全、高效的復(fù)用,避免了數(shù)據(jù)庫(kù)連接頻繁建立、關(guān)閉的開銷。

數(shù)據(jù)庫(kù)連接池的基本原理是在內(nèi)部對(duì)象池中維護(hù)一定數(shù)量的數(shù)據(jù)庫(kù)連接,并對(duì)外暴露數(shù)據(jù)庫(kù)連接獲取和返回方法。如:外部使用者可通過(guò)getConnection方法獲取連接,使用完畢后再通過(guò)releaseConnection方法將連接返回,注意此時(shí)連接并沒有關(guān)閉,而是由連接池管理器回收,并為下一次使用做好準(zhǔn)備。

數(shù)據(jù)庫(kù)連接池技術(shù)帶來(lái)的好處:

1、資源重用

由于數(shù)據(jù)庫(kù)連接得到重用,避免了頻繁創(chuàng)建、釋放鏈接引起的大量性能開銷。在減少系統(tǒng)消耗的基礎(chǔ)上,另一方面也增進(jìn)了系統(tǒng)運(yùn)行環(huán)境的平穩(wěn)性(減少內(nèi)存碎片以及數(shù)據(jù)庫(kù)臨時(shí)進(jìn)行/線程數(shù)量)

2、更快地系統(tǒng)響應(yīng)速度

數(shù)據(jù)庫(kù)連接池在初始化過(guò)程中,往往已經(jīng)創(chuàng)建了若干數(shù)據(jù)庫(kù)連接池置于池中備用。此時(shí)連接的初始化工作均已完成,對(duì)于業(yè)務(wù)請(qǐng)求處理而言,直接利用現(xiàn)有可用連接,避免了數(shù)據(jù)庫(kù)連接初始化和釋放過(guò)程的時(shí)間開銷,從而縮減了系統(tǒng)整體響應(yīng)時(shí)間

3、統(tǒng)一的連接管理,避免數(shù)據(jù)庫(kù)連接泄露

在較為完備的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn)中,可根據(jù)預(yù)先的連接占用超時(shí)設(shè)定,強(qiáng)制收回被占用連接,從而避免了常規(guī)數(shù)據(jù)庫(kù)連接操作中可能出現(xiàn)的資源泄露。

目前數(shù)據(jù)庫(kù)連接池產(chǎn)品是非常多的,主要有:

1、dbcp

dbcp,即DataBase Connection PoolApache出品,Spring開發(fā)組推薦使用的數(shù)據(jù)庫(kù)連接池,開發(fā)較為活躍,是一個(gè)使用極為廣泛的數(shù)據(jù)庫(kù)連接池產(chǎn)品。不過(guò)從網(wǎng)上

2、c3p0

Hibernate開發(fā)組推薦使用的數(shù)據(jù)庫(kù)連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和JNDI的綁定

3、Proxool

Proxool的口碑較好,沒什么負(fù)面評(píng)價(jià)(比如dbcp就是因?yàn)镠ibernate認(rèn)為它BUG太多Hibernate才不推薦使用的),也是Hibernate開發(fā)組推薦使用的數(shù)據(jù)庫(kù)連接池,不過(guò)使用者不算多,開發(fā)不夠活躍。這個(gè)連接池提供了連接池監(jiān)控的功能,方便易用,便于發(fā)現(xiàn)連接池泄露的情況

基于Spring的JDBC基本框架搭建

先講一下使用Spring實(shí)現(xiàn)JDBC,數(shù)據(jù)庫(kù)連接池就用Spring開發(fā)組推薦的DBCP,DBCP需要三個(gè)jar包,先下載一下:

1、commons-dbcp-1.4.jar,官方網(wǎng)站上有,點(diǎn)我下載

2、commons.pool-1.6.jar,官方網(wǎng)站上有,點(diǎn)我下載

3、commons.collections4-4.0.jar,官方網(wǎng)站上有

下載了這三個(gè)jar包之后請(qǐng)導(dǎo)入自己的工程中(注意MySql的包別忘記導(dǎo)入了),雖然dbcp和pool都出了dbcp2和pool2的版本,Apache官網(wǎng)上都可以下載,但是這里提供的還是dbcp1和pool1的版本下載地址,一個(gè)原因是dbcp2和pool2都只可以在JDK1.7及JDK1.7以上的版本運(yùn)行,而dbcp1和pool1則可以在JDK1.6的版本運(yùn)行,考慮到MyEclipse10默認(rèn)自帶的JRE就是1.6版本的,所以這里下載、使用dbcp1和pool1。想要dbcp2和pool2的可以自己去Apache官網(wǎng)下載,不過(guò)要注意,dbcp2必須和pool2一組,dbcp1必須和pool1一組,不可以混著用。

JDBC,我之前寫過(guò)一篇文章,數(shù)據(jù)庫(kù)建立和實(shí)體類都是用的原文章里面的,這里只是把原生的JDBC搬到Spring JDBC下而已,看下最基礎(chǔ)的寫法,再添加功能,學(xué)生管理類為:

public class StudentManager
{
 private JdbcTemplate jdbcTemplate;

 private static StudentManager instance = new StudentManager();

 public static StudentManager getInstance()
 {
 return instance;
 }

 public JdbcTemplate getJdbcTemplate()
 {
 return jdbcTemplate;
 }
 public void setJdbcTemplate(JdbcTemplate jdbcTemplate)
 {
 this.jdbcTemplate = jdbcTemplate;
 }
}

Spring的XML配置文件命名為jdbc.xml,jdbc.xml的寫法為:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.2.xsd">

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <!-- 驅(qū)動(dòng)包名 -->
 <property name="driverClassName" value="com.mysql.jdbc.Driver" />
 <!-- 數(shù)據(jù)庫(kù)地址 -->
 <property name="url" value="jdbc:mysql://localhost:3306/school?useUnicode=true&amp;characterEncoding=utf8;" />
 <!-- 用戶名 -->
 <property name="username" value="root" />
 <!-- 密碼 -->
 <property name="password" value="root" />
 <!-- 最大連接數(shù)量 -->
 <property name="maxActive" value="150" />
 <!-- 最小空閑連接 -->
 <property name="minIdle" value="5" />
 <!-- 最大空閑連接 -->
 <property name="maxIdle" value="20" />
 <!-- 初始化連接數(shù)量 -->
 <property name="initialSize" value="30" />
 <!-- 連接被泄露時(shí)是否打印 -->
 <property name="logAbandoned" value="true" />
 <!-- 是否自動(dòng)回收超時(shí)連接 -->
 <property name="removeAbandoned" value="true" />
 <!-- 超時(shí)等待時(shí)間(以秒為單位) -->
 <property name="removeAbandonedTimeout" value="10" />
 </bean>

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> 
 <property name="jdbcTemplate" ref="jdbcTemplate" />
 </bean>
</beans>

主函數(shù)為:

public static void main(String[] args)
{ 
 ApplicationContext ac = 
  new ClassPathXmlApplicationContext("jdbc.xml");
 System.out.println(StudentManager.getInstance());
 System.out.println(StudentManager.getInstance().getJdbcTemplate());
}

運(yùn)行沒什么問(wèn)題,得到StudentManager的引用地址和StudentManager中屬性jdbcTemplate的引用地址,說(shuō)明整個(gè)連接、注入都沒問(wèn)題。

JDBCTemple是Spring里面最基本的JDBC模板,利用JDBC和簡(jiǎn)單的索引參數(shù)查詢提供對(duì)數(shù)據(jù)庫(kù)的簡(jiǎn)單訪問(wèn)。除了JDBCTemplate,Spring還提供了NamedParameterJdbcTemplate和SimpleJdbcTemplate兩個(gè)類,前者能夠在執(zhí)行查詢時(shí)把值綁定到SQL里的命名參數(shù)而不是使用索引,后者利用Java 5的特性比如自動(dòng)裝箱、泛型和可變參數(shù)列表來(lái)簡(jiǎn)化JDBC模板的使用。具體使用哪個(gè)看個(gè)人喜好,這里使用JdbcTemplate,所以把JdbcTemplate添加到學(xué)生管理類中。

另外:

1、dbcp提供很多參數(shù)給用戶配置,每個(gè)參數(shù)的意思都以注釋的形式寫在.xml里面了,更加具體要知道每個(gè)參數(shù)的意思可以上網(wǎng)查詢一下

2、注意dbcp的屬性u(píng)rl,url指的是數(shù)據(jù)庫(kù)連接地址,遇到特殊字符需要轉(zhuǎn)義,所以這里的"&"變成了"&amp;",不然會(huì)報(bào)錯(cuò)

基于Spring的JDBC增刪改查

上面一部分搭建了一個(gè)Spring JDBC的基礎(chǔ)框架,下面看一下Java代碼如何實(shí)現(xiàn)CRUD,這個(gè)過(guò)程中jdbc.xml都不需要變化。

1、添加一個(gè)學(xué)生信息,代碼為:

// 添加學(xué)生信息
public boolean addStudent(Student student)
{
 try
 {
 jdbcTemplate.update("insert into student values(null,?,?,?)", 
  new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone()},
  new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}

2、根據(jù)Id刪除指定學(xué)生信息,代碼為:

// 根據(jù)Id刪除單個(gè)學(xué)生信息
public boolean deleteStudent(int id)
{
 try
 {
 jdbcTemplate.update("delete from student where studentId = ?", new Object[]{id}, new int[]{Types.INTEGER});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}

3、根據(jù)Id更新學(xué)生信息,代碼為:

// 根據(jù)Id更新指定學(xué)生信息
public boolean updateStudent(int Id, Student student)
{
 try
 {
 jdbcTemplate.update("update student set studentName = ?, studentAge = ?, studentPhone = ? where studentId = ?", 
  new Object[]{student.getStudentName(), student.getStudentAge(), student.getStudentPhone(), Id},
  new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR, Types.INTEGER});
 return true;
 }
 catch (Exception e)
 {
 return false;
 }
}

4、根據(jù)Id查詢學(xué)生信息,代碼為:

// 根據(jù)學(xué)生Id查詢單個(gè)學(xué)生信息
public Student getStudent(int id)
{
 try
 {
 return (Student)jdbcTemplate.queryForObject("select * from student where studentId = ?", 
  new Object[]{id}, new int[]{Types.INTEGER}, new RowMapper<Student>(){
  public Student mapRow(ResultSet rs, int arg1) throws SQLException
  {
  Student student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4));
  return student;
  }
 });
 }
 // 根據(jù)Id查詢學(xué)生信息拋異常, 不管什么原因, 認(rèn)為查詢不到該學(xué)生信息, 返回null
 catch (DataAccessException e)
 {
 return null;
 }
}

5、查詢所有學(xué)生信息,代碼為:

// 查詢所有學(xué)生信息
public List<Student> getStudents()
{
 List<Map<String, Object>> resultList = jdbcTemplate.queryForList("select * from student");
 List<Student> studentList = null;
 if (resultList != null && !resultList.isEmpty())
 {
 studentList = new ArrayList<Student>();
 Map<String, Object> map = null;
 for (int i = 0; i < resultList.size(); i++)
 {
  map = resultList.get(i);
  Student student = new Student(
  (Integer)map.get("studentId"), (String)map.get("studentName"),
  (Integer)map.get("studentAge"), (String)map.get("studentPhone")
  );
  studentList.add(student);
  }
 }
 return studentList;
}

這就是簡(jiǎn)單的CRUD操作,有了這5個(gè)作為基礎(chǔ),其余都可以在這5個(gè)的基礎(chǔ)上做擴(kuò)展,就不繼續(xù)詳細(xì)寫下去了,說(shuō)幾個(gè)注意點(diǎn):

1、個(gè)人使用經(jīng)驗(yàn)來(lái)說(shuō),除了最后一個(gè)查詢所有的以外,建議給其他的都加上try...catch...塊,因?yàn)樵诓僮魇〉臅r(shí)候會(huì)拋出異常,捕獲了就可以知道這次的操作失敗了,否則只能程序終止,而自己也不知道操作到底是成功還是失敗

2、添加信息、更新信息不建議把每個(gè)待操作的字段都作為形參而建議形參就是一個(gè)Student實(shí)體類,這樣一來(lái)更符合面向?qū)ο蟮脑O(shè)計(jì)原則,二來(lái)形參列表的字段多很容易導(dǎo)致出錯(cuò)

3、update、query方法,如果有占位符?的話,建議選擇有參數(shù)類型的重載方法,指定每個(gè)占位符的字段類型,就像我上面代碼寫的那樣

最后,這里講的都是jdbcTemplate的基本使用,jdbcTemplate里面還有很多方法,就不一一細(xì)說(shuō)了,可以自己去試一下,也可以查閱Spring API文檔。

讀取配置文件中的數(shù)據(jù)

之前我們都是把數(shù)據(jù)庫(kù)連接的一些屬性配置在db.properties里面的,這樣方便修改,而這里卻是在jdbc.xml里面寫死的,所以要想一個(gè)辦法怎么可以從db.properties里面讀取出配置,context幫助開發(fā)者實(shí)現(xiàn)了這一點(diǎn),看一下jdbc.xml如何寫:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.2.xsd">

 <context:property-placeholder location="classpath:db.properties"/>

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
 <!-- 驅(qū)動(dòng)包名 -->
 <property name="driverClassName" value="${mysqlpackage}" />
 <!-- 數(shù)據(jù)庫(kù)地址 -->
 <property name="url" value="${mysqlurl}" />
 <!-- 用戶名 -->
 <property name="username" value="${mysqlname}" />
 <!-- 密碼 -->
 <property name="password" value="${mysqlpassword}" />
 <!-- 最大連接數(shù)量 -->
 <property name="maxActive" value="150" />
 <!-- 最小空閑連接 -->
 <property name="minIdle" value="5" />
 <!-- 最大空閑連接 -->
 <property name="maxIdle" value="20" />
 <!-- 初始化連接數(shù)量 -->
 <property name="initialSize" value="30" />
 <!-- 連接被泄露時(shí)是否打印 -->
 <property name="logAbandoned" value="true" />
 <!-- 是否自動(dòng)回收超時(shí)連接 -->
 <property name="removeAbandoned" value="true" />
 <!-- 超時(shí)等待時(shí)間(以秒為單位) -->
 <property name="removeAbandonedTimeout" value="10" />
 </bean>

 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
 <property name="dataSource" ref="dataSource" />
 </bean>
 <bean id="studentManager" class="com.xrq.jdbc.StudentManager" factory-method="getInstance"> 
 <property name="jdbcTemplate" ref="jdbcTemplate" />
 </bean>
</beans>

重點(diǎn)就是第10行,第14、第16、第18、第20行就是取屬性的寫法,和前端的FTL語(yǔ)言類似。

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合RabbitMQ的5種模式實(shí)戰(zhàn)

    SpringBoot整合RabbitMQ的5種模式實(shí)戰(zhàn)

    本文主要介紹了SpringBoot整合RabbitMQ的5種模式實(shí)戰(zhàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于@Table注解無(wú)法使用及報(bào)紅的解決

    基于@Table注解無(wú)法使用及報(bào)紅的解決

    這篇文章主要介紹了基于@Table注解無(wú)法使用及報(bào)紅的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題

    詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題

    今天在使用 8.0.12 版的 mysql 驅(qū)動(dòng)時(shí)遇到了各種各樣的坑。這篇文章主要介紹了詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動(dòng)遇到的問(wèn)題,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)

    XMLType是Oracle支持的一種基于XML格式存儲(chǔ)的數(shù)據(jù)類型,這里我們共同來(lái)探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:
    2016-07-07
  • 源碼閱讀之storm操作zookeeper-cluster.clj

    源碼閱讀之storm操作zookeeper-cluster.clj

    這篇文章主要介紹了源碼閱讀之storm操作zookeeper-cluster.clj的相關(guān)內(nèi)容,對(duì)其源碼進(jìn)行了簡(jiǎn)要分析,具有參考意義,需要的朋友可以了解下。
    2017-10-10
  • Java由淺入深分析多態(tài)的概念

    Java由淺入深分析多態(tài)的概念

    多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定
    2022-04-04
  • 關(guān)于Sentinel中冷啟動(dòng)限流原理WarmUpController

    關(guān)于Sentinel中冷啟動(dòng)限流原理WarmUpController

    這篇文章主要介紹了關(guān)于Sentinel中冷啟動(dòng)限流原理WarmUpController,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-04-04
  • springboot實(shí)現(xiàn)異步任務(wù)

    springboot實(shí)現(xiàn)異步任務(wù)

    這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)異步任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • springboot配置多數(shù)據(jù)源的實(shí)例(MongoDB主從)

    springboot配置多數(shù)據(jù)源的實(shí)例(MongoDB主從)

    下面小編就為大家分享一篇springboot配置多數(shù)據(jù)源的實(shí)例(MongoDB主從),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解DES加密算法的原理與Java實(shí)現(xiàn)

    詳解DES加密算法的原理與Java實(shí)現(xiàn)

    DES 加密,是對(duì)稱加密。對(duì)稱加密,顧名思義,加密和解密的運(yùn)算全都是使用的同樣的秘鑰。這篇文章主要為大家講講DES加密算法的原理與Java實(shí)現(xiàn),需要的可以參考一下
    2022-10-10

最新評(píng)論

泾川县| 杭锦后旗| 公安县| 台东县| 巴彦淖尔市| 武穴市| 五华县| 包头市| 太原市| 延吉市| 湖北省| 遂昌县| 赤峰市| 阜新| 睢宁县| 泉州市| 吴桥县| 柯坪县| 惠东县| 崇义县| 桦甸市| 武威市| 茶陵县| 南汇区| 托克逊县| 绥宁县| 五大连池市| 枝江市| 卢龙县| 贞丰县| 临邑县| 安西县| 辉县市| 大理市| 朝阳市| 长沙市| 吴堡县| 湛江市| 洛浦县| 扎赉特旗| 驻马店市|