Saturday, January 31, 2009

By the way: [DriverManagerConnectionProvider:41] Using Hibernate built-in connection pool (not for production use

.... one addition to my last hibernate post:

The main reason why I tried the c3p0 solution first (besides me not being an experienced mysql admin) was the following message in the output of my local Tomcat test-instance:

[DriverManagerConnectionProvider:41] Using Hibernate built-in connection pool (not for production use!)

(See my last post how to configure c3p0 for liferay portlets:

Portlets for liferay portal with java jsf: Meanwhile: Hibernate / mySQL Problems: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes....)

Meanwhile: Hibernate / mySQL Problems: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes....

Hi all,

we're almost there.
My "user generated content" portlets are running (EasyBlogEntry and EasyComments) - but as expected: There are unforeseen problems. :)

Since I deployed the Hibernate3 based portled EasyComments I get the following exception always after the liferay server is running for some time - roughly every second day. (I use mySQL 5.0.22-0ubuntu6.06.5)


10:53:20,430 ERROR [jsp] java.lang.Exception: org.hibernate.exception.JDBCConnectionException: could not execute query
...
Caused by: org.hibernate.exception.JDBCConnectionException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
...
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:


** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure

Last packet sent to the server was 1442 ms ago.

STACKTRACE:


com.mysql.jdbc.CommunicationsException: Communications link failure

Last packet sent to the server was 1442 ms ago.
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1070)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2873)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2763)
...
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2332)

at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2774)


After quite some research in the web I got different clues about which jdbc driver to use, what mysql parameters to set and how to configure hibernate.

At first I harmonized my mySQL drivers (liferay portal had mysql-connector-java-5.0.8-bin.jar and in my portlet mysql-connector-java-5.1.5-bin.jar for some reason. (I should use the one shared library here anyway - well next time..))
Anyway: I didn't help. (I could image that it took longer until the error - but it still kept coming)

As suggested by the mySQL forum I tried now to use c3p0 as the connection pool.
I achieved this by:

1. configuring the hibernate.cfg.xml file

simply add the following to your file:

<!-- Sessions and transactions -->
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="current_session_context_class">thread</property>



As I did here:



Additionally you have to add the c3p0.jar to your portlet! I took the one from the sample portlet sample-dao-portlet-5.1.1.1.war from liferay. (Again you should by able to add it to your server and reference it via the liferay-plugin-package.properties file - but I just put in the /lib folder at first for the sake of ease.)

Unfortunately I have to wait now for at least three days to see if it really helps. Of course I will update you folks with the result. So come back and find out. :)

Sunday, January 18, 2009

Meanwhile: different JSF Versions on JBoss.. (Exception regarding org.jboss.web.jsf.integration.config.JBossJSFConfigureListener)

Hi,

before finishing my post on the user generated contend I want to put something very technical in between.

While deploying my final solution for the anonymous comments (EasyComment-Portlet) I stumpled for the tenth time about an issue regarding the various JSF Versions - and how compatible they are with the different Containers.

So once and for all I want to persist this topic here. :)

As you might be aware JBoss (at least version 4.2) brings its own JSF libraries - and dislikes the deployment of other JSF implementation libraries within an .war file. However as not all versions seem to harminize with liferay properly (I plan to publish a matrix on this one soon if there is interest) its sometimes easier to just bundle the JSF implementation of choice.

In my case I use the myfaces JSP (JSF 1.1) - based on the example portlet "Sample JSF 1.1 (MyFaces JSP)"

So as some times before I got the following error at deployment:
2009-01-17 12:58:29,454 WARN [org.jboss.web.jsf.integration.config.JBossJSFConfigureListener] MyFaces JSF implementation found! This version of JBoss AS ships with the java.net implementation of JSF. There are known issues when mixing JSF implementations. This warning does not apply to MyFaces component libraries such as Tomahawk. However, myfaces-impl.jar and myfaces-api.jar should not be used without disabling the built-in JSF implementation. See the JBoss wiki for more details.
2009-01-17 12:58:29,908 FATAL [javax.enterprise.resource.webcontainer.jsf.config] null MessageFactory
2009-01-17 12:58:29,908 ERROR [STDERR] java.lang.ClassCastException: org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener
2009-01-17 12:58:29,909 ERROR [STDERR] at com.sun.faces.config.ConfigureListener.configure(ConfigureListener.java:825)


2009-01-17 12:58:29,927 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/EasyComments-portlet]] Exception sending context initialized event to listener instance of class org.jboss.web.jsf.integration.config.JBossJSFConfigureListener
javax.faces.FacesException: java.lang.ClassCastException: org.apache.myfaces.renderkit.html.util.ExtensionsPhaseListener
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:387)
at org.jboss.web.jsf.integration.config.JBossJSFConfigureListener.contextInitialized(JBossJSFConfigureListener.java:69)

(It was especially annoying because in my local version the portlet worket (on tomcat) - whereas on my productive server (JBoss) it didn't...)

After some time I remebered what this error was about: I had to tell JBoss to take my war included libraries.

So I set the according parameter in the Web.xml of my portlet as shown below:


Here the parameter again:


<context-param>

<param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>

<param-value>true</param-value>

</context-param>

I hope this helps all the people that find this.