0

对于JavaSE客户端,如何处理DBCP?使用JDBC,我知道如何添加Apache DBCP。我可以将Apache DBCP添加到JPA吗?如果是这样,怎么样?来自JavaSE的DBCP(数据库连接池)和JPA

persistence.xml文件是否有这个选项?

代码:

package legacy.database; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.logging.Logger; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.Query; 
import javax.persistence.criteria.CriteriaBuilder; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Predicate; 
import javax.persistence.criteria.Root; 

public class MyQueries { 

    private static final Logger log = Logger.getLogger(MyQueries.class.getName()); 
    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("LegacyDatabasePU"); 
    private EntityManager em = emf.createEntityManager(); 

    public MyQueries() { 
    } 

    private List<Clients> findAll() { 
     Query q = em.createQuery("select c from Clients c"); 
     List<Clients> clients = q.getResultList(); 
     em.close(); 
     return clients; 
    } 

    public List<Clients> selectByCriteria(Criteria criteria) { 
     CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); 
     CriteriaQuery<Clients> clientCriteriaQuery = criteriaBuilder.createQuery(Clients.class); 
     Root<Clients> clientRoot = clientCriteriaQuery.from(Clients.class); 
     clientCriteriaQuery.select(clientRoot); 
     List<Predicate> predicates = new ArrayList<>(); 
     predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.phone1), "%" + criteria.getPhone1() + "%")); 
     if (!criteria.getStatus().equalsIgnoreCase("all")) { 
      predicates.add(criteriaBuilder.like(clientRoot.get(Clients_.status), "%" + criteria.getStatus() + "%")); 
     } 
     clientCriteriaQuery.where(predicates.toArray(new Predicate[0])); 
     List<Clients> clients = em.createQuery(clientCriteriaQuery).getResultList(); 
     em.close(); 
     return clients; 
    } 

    public Clients findById(int id) { 
     Clients client = em.find(Clients.class, id); 
     em.close(); 
     return client; 
    } 

} 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> 
    <persistence-unit name="LegacyDatabasePU" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>legacy.database.Clients</class> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/legacy?zeroDateTimeBehavior=convertToNull"/> 
     <property name="javax.persistence.jdbc.password" value="gjkgjtd"/> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="jdbc"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

我没有使用Tomcat,还是其他容器。

+0

看一下[HikariCP](https://github.com/brettwooldridge/HikariCP),然后查看各种配置选项 - 包括**示例属性文件:**。 – 2014-08-31 23:44:34

+0

我看到'maximumPoolSize',但没有看到示例。 – Thufir 2014-08-31 23:49:01

+0

提示,它有它自己的标题为“示例属性文件:” – 2014-08-31 23:49:48

回答

1

根据您的persistence.xml,您使用连接URL,驱动程序名称和使用的用户名/密码创建一个EntityManagerFactory,这不一定会汇集连接。因此,无法使用Spring将Apache DBCP添加到JPA或其他平台如DataNucleus。如果你使用hibernate,你可以配置hibernate-annotation.cfg.xml喜欢这个,

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/myschema</property> 
    <property name="hibernate.connection.username">user</property> 
    <property name="hibernate.connection.password">password</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="show_sql">true</property> 

    <property name="hibernate.dbcp.initialSize">8</property> 
    <property name="hibernate.dbcp.maxActive">20</property> 
    <property name="hibernate.dbcp.maxIdle">20</property> 
    <property name="hibernate.dbcp.minIdle">0</property> 
</session-factory> 
</hibernate-configuration> 
+0

的部分好吧...如果我切换到java。 SE和休眠,是否有某种形式的DBCP。可用? – Thufir 2014-09-01 16:06:13

+1

@Thufir检查我编辑后的文章 – 2014-09-02 09:08:25

+0

,但这是Hibernate特有的,他说JPA。因此,您可以轻松地将您的代码示例更改为persistence.xml(即具有相同的持久性属性,但位于persistence.xml文件中) – 2014-09-16 07:58:30

1

是的,这是可能的。您可以通过代码传递数据源,如this blog post所示。

+0

数据源处于toplink?它允许。连接。池? – Thufir 2014-09-02 09:28:13

+0

您只需编辑您的代码以使用关键字PersistenceUnitProperties.NON_JTA_DATASOURCE和实例化的DataSource作为值将一个条目传递给另一个Map。后者在你的情况下应该是一个DBCPDataSource。请注意,这是您要放入地图的唯一条目。 – llogiq 2014-09-02 10:12:13

+0

这篇博文是关于eclipselink的。我是否需要从toplink切换到eclipselink来执行此操作? – Thufir 2014-09-02 10:15:45