记录我在开发过程中遇到的各种有意思的问题
原因:
框架里使用的是detachedCriteria辅助hibernate进行查询, 如下
detachedCriteria.add(Expression.in("userId", scoresUserIds));
但是scoresUserIds是一个list,参数的长度size超过2100条,达到7W条,那么就会在后台传给数据库进行查询的时候报错。
解决方法:
修改了框架,使用单纯的hql进行分页:
List<AccountsInfo> items = ( this.getHibernateTemplate().getSessionFactory().openSession().createQuery(hql))
.setFirstResult(pagination.getCurrentPageStartItemIndex())
.setMaxResults(pagination.getMaxItemsPerPage())
.list();
解决问题。
2. 使用多数据库的系统,无法使用hql进行不同数据库之间的表的查询。
结果只能识别到一个数据库中的表的内容,另一个库中的表的实体类识别不了。
网上的人说配置多个数据源连接池和SessionFactory,每个SessionFactory对应一个数据源,我这边项目用了,但是没效果。
(至少我自己还没找到方法)。只能使用原生的sql。
3. 使用Axis2搭建webService的服务的时候,发现Axis2和spring搭配的时候,不可以使用bean来配置transactionTemplate事务,似乎对于webservice来讲,本身就不适合事务,所以在和spring搭配使用bean配置的时候,使用声明式的事务管理,会在启动的时候就报错。所以尽量用原生态的JDBC来执行,通过直接获取DataSource的方式。
或者后期尝试直接在代码里手动写事务:
package com.alensic.publicplatform;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.helix.core.context.MyApplicationContext;
public class Test {
private static DataSource dataSource;
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
dataSource = (DataSource) MyApplicationContext.getContext().getBean("dataSource");
// ApplicationContext ctx =new
// FileSystemXmlApplicationContext("D:/project/bean.xml");//根据具体路径加载文件
try {
conn = Test.dataSource.getConnection();
String sql1 = "INSERT INTO `ass_tag_info` (`info_id`, `tag_id`) VALUES (1, 1);";
String sql2 = "INSERT INTO `ass_tag_info` (`info_id`, `tag_id`) VALUES (2, 2);";
conn.setAutoCommit(false);
ps = conn.prepareStatement(sql1);
ps.execute(sql1);
ps = conn.prepareStatement(sql2);
ps.execute(sql2);
conn.commit();
ps.close();
conn.close();
} catch (Exception e) {
try {
conn.rollback();
ps.close();
conn.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
Test.dataSource = dataSource;
}
}
4.今天做项目发现个坑爹的问题。分享下。原来在jsp里面调用java后台和dwr调用同个方法。会冲突嗄!
5. 今天使用axis2做webservice的时候,发现原来webservice是不支持map的,但是支持list,不支持map是指,不能通过返回map参数,但是可以传入map参数,要用这个,必须自己转为对象或者是数组。
例如,可以用以下做法:
public List<Consult> queryUserConsult(int user_id, Map<String ,Object> map)
6. 第三条说的axis2和spring兼容性不好,不能使用spring的事务,解决办法是,使用原生的数据库事务处理。conn.setAutoCommit(false);conn.commit();conn.rollback();
7. axis2在传递java.util.Date类型的时候,会丢失时分秒。原因:
Axis2传递数据主要在axis2-adb-1.6.1.jar。打开org.apache.axis2.databinding.typemapping.SimpleTypeMapper.class文件可以看到里面定义了很多类型,估计这些就是Axis2支持的数据类型吧。看到309行为: SimpleDateFormat zulu = new SimpleDateFormat("yyyy-MM-dd");原来Axis2是先将Date类型转为了String类型。而格式为yyyy-MM-dd。
解决方案:
那么是不是在service接收转不回来了呢?终于SimpleTypeMapper.class下面找到了一个方法:public static Object makeDate(String source) {
return ConverterUtil.convertToDate(source);
}于是找到ConverterUtil类的convertToDate方法,看了一下这个方法,确实就是将String转回为Date的逻辑。但是怎么会错呢,原来它有字符串格式要求。我那自定义的格式不能识别。赶紧着这个方法进行了一点修改。在反编译、保存、替换,这次终于成功了。
8. 从axis2转型到CXF的时候。注意,
cxf不允许暴露的接口所对应的类有接口定义的变量。必须加上@WebMethod(exclude = true)。
Axis2客户端动态调用Axis2生成的服务端没问题。但是调用CXF生成的服务端就会出问题。
据网上资料说,Axis就没问题。可能是Axis2的bug。
目前使用jax-ws动态调用或者cxf调用解决。