网站建设实习任务完成情况,群晖 wordpress是什么,开源购物系统,地图定位网站开发这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按。 您可能会在文章结尾找到本书的折扣券代码#xff0c;仅适用于Java Code Geeks的读者#xff01; 请享用#xff01; 在需要数据访问权限的独立Java应用程序中使用JDBC连接池时#xff0c;大多数开发人员将使用com… 这是从我们的客人文章W4G伙伴克拉伦斯豪的作者临春3从A按。 您可能会在文章结尾找到本书的折扣券代码仅适用于Java Code Geeks的读者 请享用 在需要数据访问权限的独立Java应用程序中使用JDBC连接池时大多数开发人员将使用commons-dbcp或c3p0 。 在本教程中我们将讨论在独立Java应用程序中的Apache Tomcat Web容器中使用JDBC连接池。 Tomcat 7的新功能之一是tomcat-jdbc连接池它替代了commons-dbcp连接池。 下面列出了tomcat-jdbc相对于commons-dbcp和其他连接池库的主要优点 支持高度并发的环境和多核/ CPU系统 Commons-dbcp是单线程的速度很慢 Commons-dbcp很复杂超过60个类而tomcat-jdbc核心仅包含8个类 支持异步连接检索 XA连接支持 连接池对象公开了可以注册用于监视目的的MBean 支持common-dbcp中的大多数属性以及许多增强的属性 支持JDBC拦截器 有关配置的详细说明和文档请参考Apache Tomcat网站上的官方文档页面。 在本教程中我们将演示如何使用tomcat-jdbc开发简单的独立数据访问Java应用程序。 该应用程序将使用以下框架和库 Spring Framework 3.1.1 休眠4.1.3 Spring Data JPA 1.1.0 Tomcat JDBC连接池7.0.27 H2数据库1.3.167 番石榴12.0 该示例是使用SpringSource Tool Suite开发的可以在本文末尾下载压缩的存档 。 另一方面本教程假定您已经对使用Spring和Hibernate开发JPA应用程序有所了解。 依存关系 项目依赖项由Maven管理。 以下是项目的POM文件pom.xml的片段。 清单1 –项目依赖性 propertiesmaven.test.failure.ignoretrue/maven.test.failure.ignorespring.framework.version3.1.1.RELEASE/spring.framework.versionhibernate.version4.1.3.Final/hibernate.versionspring.data.jpa.version1.1.0.RELEASE/spring.data.jpa.versiontomcat.dbcp.version7.0.27/tomcat.dbcp.versionh2.version1.3.167/h2.versionslf4j.version1.6.4/slf4j.versionlog4j.version1.2.16/log4j.versionguava.version12.0/guava.version
/propertiesdependencies!-- Hibernate --dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-entitymanager/artifactId version${hibernate.version}/version/dependency!-- Spring Framework --dependencygroupIdorg.springframework/groupIdartifactIdspring-context-support/artifactIdversion${spring.framework.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion${spring.framework.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion${spring.framework.version}/version/dependency!-- Spring Data JPA --dependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-jpa/artifactIdversion${spring.data.jpa.version}/version/dependency!-- Tomcat DBCP --dependencygroupIdorg.apache.tomcat/groupIdartifactIdtomcat-jdbc/artifactIdversion${tomcat.dbcp.version}/version/dependency!-- Logging --dependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion${slf4j.version}/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdjcl-over-slf4j/artifactIdversion${slf4j.version}/versionscoperuntime/scope/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion${slf4j.version}/versionscoperuntime/scope/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion${log4j.version}/version/dependency!-- Others --dependencygroupIdcom.h2database/groupIdartifactIdh2/artifactIdversion${h2.version}/version/dependencydependencygroupIdcom.google.guava/groupIdartifactIdguava/artifactIdversion${guava.version}/version/dependency
/dependencies 领域对象模型 对象模型是一个简单的联系信息模型。 每个联系人都有其名字姓氏和出生日期。 同样每个联系人将与零个或多个爱好例如游泳慢跑阅读等相关联。 在DOM中有两个主要类即Contact和Hobby类。 清单2和3分别显示了这些类的代码清单。 清单2 – Contact类 Entity
Table(name contact)
public class Contact {private Long id;private int version;private String firstName;private String lastName;private Date birthDate;private SetHobby hobbies new HashSetHobby();IdGeneratedValue(strategyGenerationType.IDENTITY)Column(name ID)public Long getId() {return id;}public void setId(Long id) {this.id id;}VersionColumn(name VERSION)public int getVersion() {return version;}public void setVersion(int version) {this.version version;}Column(name FIRST_NAME)public String getFirstName() {return firstName;}public void setFirstName(String firstName) {this.firstName firstName;}Column(name LAST_NAME)public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName lastName;}Column(name BIRTH_DATE)Temporal(TemporalType.DATE)public Date getBirthDate() {return birthDate;}public void setBirthDate(Date birthDate) {this.birthDate birthDate;} ManyToManyJoinTable(name contact_hobby_detail, joinColumns JoinColumn(name CONTACT_ID), inverseJoinColumns JoinColumn(name HOBBY_ID))public Sethobby getHobbies() {return this.hobbies;}public void setHobbies(Sethobby hobbies) {this.hobbies hobbies;} public String toString() { return Contact - Id: id , First name: firstName , Last name: lastName , Birthday: birthDate;} } 清单3 – Hobby类 Entity
Table(name hobby)
public class Hobby {private String hobbyId;private SetContact contacts new HashSetContact();public Hobby() {}public Hobby(String hobbyId) {this.hobbyId hobbyId;}public Hobby(String hobbyId, SetContact contacts) {this.hobbyId hobbyId;this.contacts contacts;}IdColumn(name HOBBY_ID)public String getHobbyId() {return this.hobbyId;}public void setHobbyId(String hobbyId) {this.hobbyId hobbyId;}ManyToManyJoinTable(name contact_hobby_detail, joinColumns JoinColumn(name HOBBY_ID), inverseJoinColumns JoinColumn(name CONTACT_ID))public SetContact getContacts() {return this.contacts;}public void setContacts(SetContact contacts) {this.contacts contacts;} } 在清单2和3中注意到Contact和Hobby类之间存在多对多关系。 数据库架构 在本教程中我们将使用H2内存数据库。 有3个表 联系人该表存储联系人信息 HOBBY该表存储可用于该应用程序的兴趣爱好列表 CONTACT_HOBBY_DETAIL对Contact和Hobby类之间的多对多关系进行建模 清单4和5分别显示了数据库模式创建脚本和测试数据填充脚本的内容。 清单4 –数据库模式创建脚本schema.sql DROP TABLE IF EXISTS CONTACT;CREATE TABLE CONTACT (ID INT NOT NULL AUTO_INCREMENT,FIRST_NAME VARCHAR(60) NOT NULL,LAST_NAME VARCHAR(40) NOT NULL,BIRTH_DATE DATE,VERSION INT NOT NULL DEFAULT 0,UNIQUE UQ_CONTACT_1 (FIRST_NAME, LAST_NAME),PRIMARY KEY (ID)
);CREATE TABLE HOBBY (HOBBY_ID VARCHAR(20) NOT NULL,PRIMARY KEY (HOBBY_ID)
);CREATE TABLE CONTACT_HOBBY_DETAIL (CONTACT_ID INT NOT NULL,HOBBY_ID VARCHAR(20) NOT NULL,PRIMARY KEY (CONTACT_ID, HOBBY_ID),CONSTRAINT FK_CONTACT_HOBBY_DETAIL_1 FOREIGN KEY (CONTACT_ID)REFERENCES CONTACT (ID) ON DELETE CASCADE,CONSTRAINT FK_CONTACT_HOBBY_DETAIL_2 FOREIGN KEY (HOBBY_ID)REFERENCES HOBBY (HOBBY_ID)
); 清单5 –测试数据填充脚本test-data.sql insert into contact (first_name, last_name, birth_date) values (Clarence, Ho, 1980-07-30);
insert into contact (first_name, last_name, birth_date) values (Scott, Tiger, 1990-11-02);insert into hobby (hobby_id) values (Swimming);
insert into hobby (hobby_id) values (Jogging);
insert into hobby (hobby_id) values (Programming);
insert into hobby (hobby_id) values (Movies);
insert into hobby (hobby_id) values (Reading);insert into contact_hobby_detail(contact_id, hobby_id) values (1, Swimming);
insert into contact_hobby_detail(contact_id, hobby_id) values (1, Movies);
insert into contact_hobby_detail(contact_id, hobby_id) values (2, Swimming); 服务层 在服务层中存在2个接口 ContactService提供用于访问联系信息的服务 HobbyService提供用于访问爱好信息的服务 清单6和7分别显示了ContactService和HobbyService接口。 清单6 – ContactService接口 public interface ContactService {public ListContact findAll();public Contact findById(Long id);public Contact save(Contact contact);} 清单7 – HobbyService接口 public interface HobbyService {public ListHobby findAll();} 弹簧配置 让我们看一下Spring配置。 清单8显示了数据源事务和JPA配置。 清单8 – Spring JPA配置datasource-tx-jpa.xml !--Tomcat JDBC connection pool configutation --
bean iddataSource classorg.apache.tomcat.jdbc.pool.DataSourceproperty namedriverClassName valueorg.h2.Driver /property nameurl valuejdbc:h2:mem:testdb /property nameusername valuesa /property namepassword value /
/bean!--Intialize the database schema with test data --
jdbc:initialize-database data-sourcedataSourcejdbc:script locationclasspath:schema.sql/jdbc:script locationclasspath:test-data.sql/
/jdbc:initialize-databasebean idtransactionManager classorg.springframework.orm.jpa.JpaTransactionManagerproperty nameentityManagerFactory refemf/
/beantx:annotation-driven transaction-managertransactionManager /bean idemf classorg.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanproperty namedataSource refdataSource /property namejpaVendorAdapterbean classorg.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter//propertyproperty namepackagesToScan valuecom.skywidesoft.tomcat.dbcp.tutorial.domain/property namejpaPropertiespropsprop keyhibernate.dialectorg.hibernate.dialect.H2Dialect/propprop keyhibernate.max_fetch_depth3/propprop keyhibernate.jdbc.fetch_size50/propprop keyhibernate.jdbc.batch_size10/propprop keyhibernate.show_sqltrue/prop/props/property
/bean context:annotation-config/!--Spring Data JPA Repository Configuration --
jpa:repositories base-packagecom.skywidesoft.tomcat.dbcp.tutorial.repositoryentity-manager-factory-refemftransaction-manager-reftransactionManager/ 下面列出了清单8中配置的一些要点 对于dataSource bean使用org.apache.tomcat.jdbc.pool.DataSource类为基础连接提供JDBC DataSource接口。 您将看到配置与使用commons-dbcp基本上相同。 jdbcinitialize-database标记是Spring 3.1对使用数据库架构和测试数据初始化数据库的支持 jparepositories标记用于配置Spring Data JPA的存储库抽象。 清单9显示了Spring应用程序上下文配置。 清单9 – Spring应用程序上下文app-context.xml import resourceclasspath:datasource-tx-jpa.xml/context:component-scan base-packagecom.skywidesoft.tomcat.dbcp.tutorial.service.jpa/ Spring Data JPA存储库抽象 Spring Data JPA的存储库抽象为开发基于JPA的数据访问应用程序提供了一种简化的方法。 有关详细信息请访问项目网站 。 存储库抽象层是使用Java界面开发的。 清单10和11分别显示了ContactRepository和HobbyRepository接口的代码清单。 清单10 – ContactRepository接口 public interface ContactRepository extends CrudRepositoryContact, Long{} 清单11 – HobbyRepository接口 public interface HobbyRepository extends CrudRepositoryHobby, String{} 请注意该接口只是扩展了Spring Data Common的CrudRepository TID接口该接口已经提供了常见的数据访问操作例如findAllfindOne保存删除等。 JPA实施类 下一步是开发清单6和7中的服务层接口的JPA实现。这些类采用Spring Framework的注解用于Spring bean声明依赖项的自动装配和事务需求等。清单12和13显示了ContactServiceImpl和HobbyServiceImpl类。 清单12 – ContactServiceImpl类 Service(contactService)
Repository
Transactional
public class ContactServiceImpl implements ContactService {final static Logger logger LoggerFactory.getLogger(ContactServiceImpl.class);Autowiredprivate ContactRepository contactRepository;Transactional(readOnlytrue)public ListContact findAll() {logger.info(Finding all contacts);return Lists.newArrayList(contactRepository.findAll());}Transactional(readOnlytrue)public Contact findById(Long id) {return contactRepository.findOne(id);}public Contact save(Contact contact) {return contactRepository.save(contact);}} 清单13 – HobbyServiceImpl类 Service(hobbyService)
Repository
Transactional
public class HobbyServiceImpl implements HobbyService {Autowiredprivate HobbyRepository hobbyRepository;Transactional(readOnlytrue)public ListHobby findAll() {return Lists.newArrayList(hobbyRepository.findAll());}} 测试中 让我们看看实际的应用程序。 清单14显示了ContactServiceTest类该类仅从app-context.xml文件中引导Spring应用程序上下文查找contactService bean并调用findAll操作以从数据库中检索所有联系人。 清单14 – ContactServiceTest类 public class ContactServiceTest {public static void main(String[] args) {GenericXmlApplicationContext ctx new GenericXmlApplicationContext();ctx.load(classpath:app-context.xml);ctx.refresh();ContactService contactService ctx.getBean(contactService, ContactService.class);ListContact contacts contactService.findAll(); for (Contact contact: contacts) {System.out.println(contact);} }} 运行上面的类将在控制台输出窗口中产生以下输出省略了其他不相关的输出 2012-05-25 13:35:43,552 INFO [com.skywidesoft.tomcat.dbcp.tutorial.service.jpa.ContactServiceImpl] - Finding all contacts contact0_.BIRTH_DATE as BIRTH2_0_, contact0_.FIRST_NAME as FIRST3_0_, 从上面的输出中您可以看到从数据库中正确检索了由test-data.sql脚本填充的联系信息。 结论 本教程介绍了如何在独立的Java应用程序中使用Tomcat的JDBC连接池。 Tomcat的JDBC连接池替代了commons-dbcp连接池提供了更快功能更丰富的JDBC连接池解决方案。 它的简洁设计高性能对高度并发环境的支持以及多核/ cpu系统使其成为Tomcat Web容器和独立Java应用程序环境中的JDBC连接池提供程序的极具吸引力的选择。 下载完整的Eclipse Maven Project 。 参考来自我们的W4G合作伙伴 Clarence Ho的 独立Java应用程序中的Tomcat JDBC连接池使用 。 Clarence Ho是APress的Pro Spring 3的主要作者。 借助Pro Spring 3 您将学习Spring的基础知识和核心主题并获得作者关于远程处理 Hibernate和EJB的见解和实际经验。 除了基础知识之外您还将学习如何利用Spring框架构建企业Java应用程序的各个层或部分例如事务Web和表示层部署等。 完整的示例应用程序使您可以应用本书中介绍的许多技术并了解它们如何协同工作。 APress已为Java Code Geeks的读者提供了优惠券代码。 优惠券代码为 SPR76 有效期至2012年7月6日 。 该代码仅可从apress.com获得40的电子书折扣 。 翻译自: https://www.javacodegeeks.com/2012/06/using-tomcat-jdbc-connection-pool-in.html