开发遇到的典型问题

记录我在开发过程中遇到的各种有意思的问题



原因:

框架里使用的是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调用解决。


















  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值