Я создаю веб-приложение с Netbeans 7.3, JSF 2.1 с Primefaces 3.5 и Hibernate 3.2.5. Я запускаю его на сервере Glassfish 3.1.2 У моего проекта есть некоторые улучшения (я не уверен, как назвать его по-английски, я говорю о экране, на котором вы можете создавать, обновлять и удалять данные), поскольку это одна:Hibernate - C3P0 - connectionPool - Сделки
(я изменил некоторые оригинальные названия и тексты с испанского на английский)
MANOPINIONES ВЗГЛЯД:
<f:view locale="#{sesion.idiomaActual}">
<h:head>
<link href="CSS/estilos.css" rel="stylesheet" type="text/css"/>
</h:head>
<h:body rendered="#{sesion.isLogadoAdm()}">
<h:form>
<div class="area_mantenimiento">
<br/>
<p:panel id="panelopi" header="Mantenimiento de opiniones" styleClass="panel_mantenimiento_opi">
<p:messages globalOnly="true"/>
<br/>
<p:toolbar>
<p:toolbarGroup align="left">
<p:commandButton title="Ok" icon="ui-icon-check" disabled="#{Manopiniones_BackingBean.disabled_ok}" actionListener="#{Manopiniones_BackingBean.saveChangesListener(event)}" update="panelopi"/>
<p:commandButton title="Cancel" icon="ui-icon-closethick" disabled="#{Manopiniones_BackingBean.disabled_cancel}" actionListener="#{Manopiniones_BackingBean.cancelChangesListener(event)}" update="panelopi"/>
<p:commandButton title="Delete" icon="ui-icon-circle-minus" type="button" disabled="#{Manopiniones_BackingBean.disabled_del}" onclick="vardialogoopi.show();"/>
</p:toolbarGroup>
</p:toolbar>
<br/><br/>
<p:panel>
<p:panelGrid columns="3" styleClass="rejilla_panel_login" style="margin:0 0 0 0;font: 10px Verdana;">
<h:outputText value="Codigo de opinion:" style="font-weight:bold;"/>
<p:inputText value="#{Manopiniones_BackingBean.codigo}" disabled="#{Manopiniones_BackingBean.disabled_cod}" />
<p:commandButton title="Buscar" value=" " icon="ui-icon-search" disabled="#{Manopiniones_BackingBean.disabled_bot}" actionListener="#{Manopiniones_BackingBean.getOpinionListener(event)}" update="panelopi"/>
</p:panelGrid>
</p:panel>
<p:separator style="width:580px;height:10px; margin:10px auto auto 0;" />
<br/>
<p:panel>
<p:panelGrid columns="2" styleClass="rejilla_panel_login" style="margin:0 0 0 0;font: 10px Verdana;">
<h:outputText value="Texto: " style="font-weight:bold;"/>
<p:editor value="#{Manopiniones_BackingBean.opinion_actual.opiDes}" maxlength="5000" height="150" width="450" disabled="#{Manopiniones_BackingBean.disabled_opi}"/>
<h:outputText value="" />
<h:outputText value="" />
</p:panelGrid>
</p:panel>
<p:confirmDialog message="¿Are you sure to delete this?" header="Confirmacion" severity="alert" widgetVar="vardialogoopi" >
<p:commandButton value="OK" actionListener="#{Manopiniones_BackingBean.deleteOpinionListener(event)}" update="panelopi" oncomplete="vardialogoopi.hide();" />
<p:commandButton value="Cancel" type="button" onclick="vardialogoopi.hide();" />
</p:confirmDialog>
</p:panel>
</div>
</h:form>
</h:body>
</f:view>
MANOPINIONES Подкладочная BEAN:
@ManagedBean
@ViewScoped
public class Manopiniones_BackingBean {
private Session sesion=null;
private Opiniones opinion_actual;
private Boolean disabled_ok=true;
private Boolean disabled_cancel=true;
private Boolean disabled_del=true;
private Boolean disabled_cod=false;
private Boolean disabled_bot=false;
private Boolean disabled_opi=true;
private String codigo="";
public Manopiniones_BackingBean() {
}
@PreDestroy
public void parar() {
if(sesion!=null && sesion.isOpen()){
sesion.getTransaction().rollback();
sesion.close();
opinion_actual=new Opiniones();
disabled_ok=true;
disabled_cancel=true;
disabled_del=true;
disabled_cod=false;
disabled_bot=false;
disabled_opi=true;
}
}
public Session getSesion() {
return sesion;
}
//GETTER & SETTERS OMITTED
public void saveChangesListener(ActionEvent event) {
try {
if(opinion_actual!=null && !codigo.isEmpty()){
opinion_actual.setOpiCod(codigo);
sesion.saveOrUpdate(opinion_actual);
sesion.getTransaction().commit();
sesion.close();
opinion_actual=new Opiniones();
disabled_ok=true;
disabled_cancel=true;
disabled_del=true;
disabled_cod=false;
disabled_bot=false;
disabled_opi=true;
};
}
catch (HibernateException he) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error saving opinion.", null));
sesion.getTransaction().rollback();
sesion.close();
};
}
public void cancelChangesListener(ActionEvent event) {
sesion.getTransaction().rollback();
sesion.close();
opinion_actual=new Opiniones();
disabled_ok=true;
disabled_cancel=true;
disabled_del=true;
disabled_cod=false;
disabled_bot=false;
disabled_opi=true;
}
public void deleteOpinionListener(ActionEvent event) {
try {
sesion.delete(opinion_actual);
sesion.getTransaction().commit();
sesion.close();
opinion_actual=new Opiniones();
codigo="";
disabled_ok=true;
disabled_cancel=true;
disabled_del=true;
disabled_cod=false;
disabled_bot=false;
disabled_opi=true;
}
catch (HibernateException he) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error deleting opinion.", null));
sesion.getTransaction().rollback();
sesion.close();
};
}
public void getOpinionListener(ActionEvent event) {
try {
if(!codigo.isEmpty()){
sesion=HibernateUtil.getSessionFactory().openSession();
sesion.beginTransaction();
opinion_actual=(Opiniones)sesion.get(Opiniones.class, codigo);
disabled_ok=false;
disabled_cancel=false;
disabled_cod=true;
disabled_bot=true;
disabled_opi=false;
disabled_del=false;
if(opinion_actual==null){
opinion_actual=new Opiniones();
disabled_del=true;
};
};
}
catch (HibernateException he) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error getting opinion.", null));
sesion.getTransaction().rollback();
sesion.close();
};
}
}
Как вы можете видеть его очень простой пример «поддержки» и с оригинальной конфигурацией он отлично работал.
Я хотел бы реализовать пул соединений с использованием библиотеки C3P0, чтобы улучшить скорость, поэтому я добавил эти строки на hibernate.cfg.xml
hibernate.cfg.xml:
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/agencia</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">THE_PASSWORD</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.jdbc.batch_size">50</property>
**<!-- ADDED LINES TO IMPLEMENT CONNECTION POOL -->**
<property name="hibernate.c3p0.min_size">8</property>
<property name="hibernate.c3p0.max_size">32</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.connection.datasource">jdbc/PoolAgencia</property>
**<!-- ADDED LINES TO IMPLEMENT CONNECTION POOL -->**
**<!-- HIBERNATE MAPPING OMITTED -->**
</session-factory>
</hibernate-configuration>
Я также создал пул соединений на сервере стеклянной рыбы. Скачано и добавлено mysql-connector-java-5.0.8-bin
к моему серверу. Чтобы настроить пул, я просто изменил эти дополнительные свойства:
Databasename = the_database_name
Password = the_password
Portnumber = 3306
Servername = localhost
User = root
И, наконец, я создал JDBC Resource называется jdbc/PoolAgencia
.
Казалось, что это хорошо работает, данные были получены очень быстро в других точках Интернета. Тогда я использовал содержание таким образом:
Я пошел на страницу «уход со».
я ввел код
я нажал на кнопку "поиск".
Затем я нажимаю кнопку "отменить", и я получаю эту ошибку:
SEVERE: JDBC rollback failed
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Can't call rollback when autocommit=true
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)
at com.mysql.jdbc.Connection.rollback(Connection.java:5257)
at com.sun.gjc.spi.base.ConnectionHolder.rollback(ConnectionHolder.java:630)
at org.hibernate.transaction.JDBCTransaction.rollbackAndResetAutoCommit(JDBCTransaction.java:183)
at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:162)
Если я использую "содержание" таким образом:
- Я иду на " upkeep ".
- Я ввожу код (он не против, новый или существующий)
- Я нажимаю кнопку «Поиск».(Если код существует в базе данных он извлекается, другой путь, когда создается новый один)
- Потом нажмите кнопку «ОК» (необходимо сохранить все изменения), и я получаю эту ошибку:
SEVERE: JDBC commit failed
java.sql.SQLException: Can't call commit when autocommit=true
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:914)
at com.mysql.jdbc.Connection.commit(Connection.java:2275)
at com.sun.gjc.spi.base.ConnectionHolder.commit(ConnectionHolder.java:244)
at org.hibernate.transaction.JDBCTransaction.commitAndResetAutoCommit(JDBCTransaction.java:139)
Поскольку я читал обе ошибки, я понимаю, что транзакции не работают должным образом с пулом. Я думаю, что это проблема пула соединений или проблемы с конфигурацией спящего режима. Я сделал поиск по сети, и я попытался изменить некоторые параметры конфигурации пула соединений без везения.
Почему это происходит?
Это точка !! Я попытался настроить то же свойство, которое вы написали в файле hibernate.cfg.xml, без какого-либо эффекта! Произошла такая же ошибка. Есть идеи?? –
Хорошо, я понял! У меня есть пул связи на стеклянной рыбке. Есть 161 необязательный параметр. Я пропустил одного из них под названием «relaxAutoCommit». Я просто положил его на TRUE, и все работает отлично! спасибо! –