proxool连接池 CharConversionException原因分析及处理

来源:互联网 发布:java sha1 编辑:程序博客网 时间:2024/06/18 18:37

       proxool连接池由于其比较强的监控功能,如sql语句执行时间统计、sql语句抓取等颇受部分人群的欢迎,基于此最近一个项目也使用了proxool连接池。Proxool管理功能只要在web.xml文件中配置ProxoolAdminServlet即可,如下所示:

    <servlet>

       <servlet-name>ProxoolAdminServlet</servlet-name>

        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.

AdminServlet

</servlet-class>

    </servlet>

    <servlet-mapping>

       <servlet-name>ProxoolAdminServlet</servlet-name>

       <url-pattern>/ProxoolAdmin</url-pattern>

    </servlet-mapping>

       则只要我们访问http://{id}:{端口}/{context名称}/ ProxoolAdmin,即可查看连接池信息,如:连接池配置信息,连接池服务次数,正在执行的sql语句,sql语句执行时间等。

    但是,在查看有些sql语句的时候,却抛出CharConversionExceptionjava.io.CharConversionException: Not an ISO 8859-1 character: 中。纵观所有可以查看的sql语句都不包含中文,因此估计是servelt输出中文导致。

 

    原因分析:

ProxoolAdminServlet的所有响应都是执行doGet函数,该函数返回的都是response信息,都是通过response.getOutputStream().println输出,因此只要sql语句中包含中文,执行response.getOutputStream().println(“含中文的sql语句”)就一定会报java.io.CharConversionException

 

解决办法:

由于AdminServlet直接通过response.getOutputStream()print信息,因此设置ContentType或者characterencoding都不能解决此问题,除非更换printwriter来输出或者将输出的内容都转换为iso编码。不管如何,我们都要新建一个Proxool AdminServelt,假设为AdminServeltEX, AdminServeltEX应继承自AdminServelt,然后重写AdminServeltEXdoGet方法即可。

AdminServeltEXdoGet方法中,我们可以用printwriter进行输出,或者保留response.getOutputStream()的输出,但是将输出信息全部进行iso编码。

修改web.xml配置,将proxool管理servletservlet-class替换成AdminServeltEX即可。