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