nyx*_*yxz 0 jboss jpa java-ee threadpool
我有一个JSF 2.0页面,用户可以在其中登录,他可以选择注销(令人惊讶)。我的JBoss服务器配置最多允许7个线程(连接)。我与一位用户测试了几次页面登录,然后尝试进行7次尝试Transaction not active,这也许意味着注销后连接不会重新回到池中并保持打开状态。
问:注销和返回线程池中的线程的方法是什么?这个问题困扰了我很长时间。请帮忙。
这是我的JBoss中standalone.xml用于限制连接的数据源的配置:
<subsystem xmlns="urn:jboss:domain:datasources:1.0">
<datasources>
<datasource jndi-name="java:jboss/MyJndiDS" pool-name="MyPoolDS" enabled="true" jta="true" use-java-context="false" use-ccm="true">
<connection-url>
jdbc:postgresql://192.168.2.125:5432/t_report
</connection-url>
<driver>
org.postgresql
</driver>
<transaction-isolation>
TRANSACTION_READ_COMMITTED
</transaction-isolation>
<pool>
<min-pool-size>
3
</min-pool-size>
<max-pool-size>
7
</max-pool-size>
<prefill>
true
</prefill>
<use-strict-min>
false
</use-strict-min>
<flush-strategy>
FailingConnectionOnly
</flush-strategy>
</pool>
<security>
<user-name>
my_user
</user-name>
<password>
my_pass
</password>
</security>
<statement>
<prepared-statement-cache-size>
32
</prepared-statement-cache-size>
</statement>
</datasource>
...
...
</datasources>
</subsystem>
Run Code Online (Sandbox Code Playgroud)
和在注销方法@SessionScoped类
import javax.faces.context.ExternalContext;
...
...
@Inject ExternalContext ec;
public void validateUserLogOut() {
HttpServletRequest request = (HttpServletRequest)ec.getRequest();
request.getSession().invalidate();
this.setUserLoggedIn(false);
navigation.logout();
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是用户登录的方式。希望这会有所帮助。
public void validateLogUser() {
ResourceBundle bundle = ResourceBundle.getBundle("internationalization.language", context.getViewRoot().getLocale());
String validation = logUser();
if((validation == null) || validation.isEmpty()) {
context.addMessage(null,
new FacesMessage(FacesMessage.SEVERITY_WARN,
bundle.getString("wrongUsername"),bundle.getString("wrongUsername")));
} else if (validation == "welcome") {
this.setUserLoggedIn(true);
navigation.login();
}
}
Run Code Online (Sandbox Code Playgroud)
哪里logUser()是:
public synchronized String logUser() {
try {
EntityManagerUtil.getEntityManager().getTransaction().begin();
System.out.println(user);
if(user.getUsername().isEmpty() || (user.getUsername() == null)) {
return null;
}
String password = user.getPassword();
user = (UserBean) EntityManagerUtil.getEntityManager().find(UserBean.class, user.getUsername());
if(user == null) {
HttpServletRequest request = (HttpServletRequest)ec.getRequest();
request.getSession().invalidate();
}
if(user.getPassword().equals(password)) {
log.info("User: " + user.getUsername() + " logged successfully.");
return "welcome";
} else {
HttpServletRequest request = (HttpServletRequest)ec.getRequest();
request.getSession().invalidate();
return null;
}
} catch (Exception e) {
log.error("Error while logging in : \n\t" + e);
EntityManagerUtil.getEntityManager().getTransaction().rollback();
return null;
} finally {
EntityManagerUtil.close();
}
}
Run Code Online (Sandbox Code Playgroud)
这是如何EntityManagerUtil.getEntityManager()工作的:
/**
* ThreadLocal instance that holds unique EntityManager per thread,
* it means that every thread accessing this ThreadLocal will has it's own instance of EntityManager
*/
private static final ThreadLocal<EntityManager> entitymanager =
new ThreadLocal<EntityManager>();
/**
* @param persistenceUnit - String name of the persistece unit
* to be used as declared inside persistence.xml
* @return singleton instance of EntityManagerFactory
*/
public synchronized static EntityManagerFactory initializeEntityManagerFactory( String persistenceUnit ) {
if ( entityManagerFactory == null ) {
// Create the EntityManagerFactory
entityManagerFactory = Persistence.createEntityManagerFactory( persistenceUnit );
}
return entityManagerFactory;
}
/**
* @return Singleton instance of EntityManager per Thread
*/
public static EntityManager getEntityManager() {
initializeEntityManagerFactory( "MyPersistenceUnit" );
EntityManager entityManager = entitymanager.get();
// Create a new EntityManager
if ( entityManager == null) {
entityManager = entityManagerFactory.createEntityManager();
entitymanager.set( entityManager );
}
return entityManager;
}
/**
* Close all ThreadLocals
*/
public static void close() {
final EntityManager entityManager = entitymanager.get();
entitymanager.set( null );
if ( entityManager != null && entityManager.isOpen()) {
entityManager.close();
}
if ( entityManagerFactory != null && entityManagerFactory.isOpen()) {
entityManagerFactory.close();
}
}
Run Code Online (Sandbox Code Playgroud)
您正在重新发明轮子。请通过在容器管理的实体管理器中添加@PersistenceContext注解并EJB管理交易来使用它。这将容易得多,并且出错的可能性也较小。
这是一个简单的DAO:
@Stateless
public class UserDAO {
@PersistenceContext
private EntityManager entityManager;
public void insertUser(User user) {
entityManager.persist(user);
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,中的每个方法EJB都是事务性的。您可以使用@TransactionAttribute注释实现细粒度的控制。真的很简单。
| 归档时间: |
|
| 查看次数: |
587 次 |
| 最近记录: |