gpt4 book ai didi

java - 带有 Glassfish 连接池的 Postgres

转载 作者:行者123 更新时间:2023-11-29 11:57:42 24 4
gpt4 key购买 nike

我是 Java EE 世界的新手,想在 Web 应用程序中使用 PostgreSQL 作为我的数据库。我使用 Glassfish 作为我的应用程序服务器并通过管理界面添加了一个连接池(我使用这个 site 寻求帮助)。现在我不知道在我的应用程序中使用连接池的“正确”方式是什么(事实上,我目前甚至不知道如何从池中获取连接并编写一个简单的查询)。

我们需要编写非常复杂的查询,所以我不知道是否应该为每个表创建一个映射并使用映射,或者只使用 sql 和某种行映射器来解析结果(我们使用了 Spring RowMapper 之前)。

所以我的问题是:

  1. 使用池中的连接有哪些不同的方式?
  2. 这些模式的(缺点)优点是什么?
  3. 如何创建可以处理复杂和性能密集型查询的巧妙映射。
  4. 这适用于 Hibernate 吗?如果是这样,怎么做?

最佳答案

1 - 如果您的连接池是使用 glassfish 配置的,您可以开发一个简单的 EJB 并使用注释注入(inject)连接,我认为这是处理来自您的池的连接的最佳方式。

(所有示例都与hibernate兼容,并且在postgresql数据库上运行良好)

例如:

@Stateless
public class myEjb
{
// inject the entityManager
@PersistenceContext(unitName = "myPu")
private EntityManager em;

public Car findCarById(Long carId)
{
Car aCar = (Car) em.find(Car.class, carId);
return aCar;
}
}

unitName“myPu”是在 glassfish 管理控制台中配置的 JDBC 资源的 JNDI 名称。

2 - 这种模式的优点是它不依赖于代码,您不能更改有关开发、测试或生产环境的 JDBC 资源。 JDBC url、用户和密码是在服务器上配置的,而不是在每次从一个环境切换到另一个环境时都可能仔细更改的 XML 文件中。这样您就不必处理事务,这是在异常时提交或回滚的服务器。如果需要自己处理事务,可以在Stateless下面加上注解:

@TransactionManagement(value=TransactionManagementType.BEAN) 

您需要自己处理交易,例如:

em.getTransaction().begin();
try
{
// do something with the entityManager
em.getTransaction().commit();
}
catch(MyException ex)
{
em.getTransaction().rollback();
}

3 - 如果您需要创建复杂的请求,您可以在您的实体上声明一些命名查询。下面是 Car 实体的可能实现:

@Entity
public class Car
{
@NamedQueries(
{
@NamedQuery(name = "Car.findByBrandAndColor", query = "SELECT c FROM Car WHERE c.brand = :brand AND color = :color")
})
}

下面是一个使用先前命名查询添加到 EJB 的函数示例:

public List<Car> findAllCarByBrandAndColor(String aBrand, String aColor)
{
List<Car> theCars;

Query theQuery = em.createNamedQuery("Car.findByBrandAndColor");
theQuery.setParameter("brand", aBrand);
theQuery.setParameter("color", aColor);

try
{
theCars = (List<Car>) query.getResultList();
}
catch(NoResultException ex)
{
theCars = null;
}

return theCars;
}

当然,您可以根据需要编写复杂的命名查询(命名查询会被缓存,可能会提高性能),但如果您确实需要直接查询数据库,则可以使用如下原生查询:

// the query is native SQL
Query theQuery = em.createNativeQuery("SELECT * FROM car WHERE color = 'blue' AND brand = 'toyota'", Car.class);
Car aCar = (Car) query.getSingleResult();

关于java - 带有 Glassfish 连接池的 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6640690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com