项目中遇到的问题以及解决办法



1.  从pl/sql查询字段类型为number并且长度大于16位的内容显示为科学计数法的计数方法,后经查找找到了如下解决办法: 
   1.1. 在toad中->view->option->data->display large number in scientific notation,不选择该选项即可 
          在pl/sql developer中->tools->preferences->sql windows->number fields tochar,选中该选项即可。


   1.2.  查看numw参数 
           sql>show  numw 
           numwidth 10 
           修改此参数为需要位数,如: 
           set numw 19 
           之后查询此字段内容正常。

    1.3 还可以直接通过to_char形式

          select to_char(double1) from table


2. 关于在oracle中number超过16位的,java提取出来之后变成科学计数法的,可以用下面的解决办法

   关于科学计数法,就是(  1200=1.2e3 )


NumberFormat ns = NumberFormat.getInstance();

   ns.setGroupingUsed(false);

   ns.format(xx);



3. 关于oracle 的number 在java提取之后,精度丢失问题

  oracle number(16) 当number位数超过16之后,在java里面就不能用double来对应,应该用BigDecimal

  精度存到oracle是不会丢失的,可以通过sqlplus查看!


4. 关于oracle插入中文问题

    在pl/sql上直接insert中文到char,没问题,但是到了java上插入中文,就报出  仅能绑定要插入 LONG 列的 LONG 值

   刚开始以为是java的编码到 oracle 的问题,

   然后用select userenv('language') from dual;

   然后得到zhs16gbk,这个没错啊,我到了java里面同样用了  new String(str1.getBytes("gbk"),"gbk");

   问题还是解决不了

   后来看了本地客户端是10.1,服务器是10.2,然后找了oracle 的jdbc下的ojdbc版本,我的是ojdbc14,服务器是ojdbc6,我换了一下,解决了问题!!


5. 关于Spring+hibernate 统计语句问题


String sql = "select sum(y.amount),count(*) from InsuredRolldtlTemp y where y.id.batchid='"+batchid+"'";

   List list = getHibernateTemplate().find(sql);

   return list;


   List mxlist = dao.get();

   Object[] object = (Object[]) mxlist.get(0);

   double sum = (double)object[1];

   double count = (double)object[1];




6. 关于log4j


Log4j.properties  配置文件

   log4j.rootLogger=INFO,R,stdout

   log4j.appender.stdout=org.apache.log4j.ConsoleAppender

   log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

   # Pattern to output the caller's file name and line number.

   log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%C:%L) - %m%n

   log4j.logger.ShareDblog=INFO,R4

   log4j.appender.R4=org.apache.log4j.DailyRollingFileAppender

   log4j.appender.R4.File=../exchglogs/shareDb.log

   log4j.appender.R4.layout=org.apache.log4j.PatternLayout

   log4j.appender.R4.layout.ConversionPattern=%m%n


   Java 代码调用

   private static Logger log = Logger.getLogger("ShareDblog");

   log.info("success!!!!");


   查看日志,在tomcat根目录下的 exchglogs目录下


7. oracle 分页

   rownum 取记录数

   String sql = "from YbMrqsData y where y.id.qsrq='"+qsrq+"' and rownum=1";



8.Java 编码


打印所以系统属性: System.getProperties().list(System.out);

  设置系统属性: System.setProperty("file.encoding", "UTF-8");        

                         System.setProperty("sun.jnu.encoding", "UTF-8");



   关于 file.encoding 和 sun.jnu.encoding 的区别

sun.jnu.encoding 影响文件名的创建,而 file.encoding 则影响到文件内容。

所以说,在我们使用 Java 处理中文文件的时候,如果发现文件的中文内容没有乱码,而文件的中文名发生乱码,我们就应当多考虑一下 sun.jnu.encoding 和 file.encoding 的区别了。



   在Eclipse 里面,在 class 文件右键属性,修改Text file encoding 编码,其实修改的就是 file.encoding 编码



  测试编码:

  String str = new String("测试".getBytes(),"UTF-8");



8. Linux 程序端口占用情况

   今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用。    

   使用命令:

   ps -aux | grep tomcat

   发现并没有8080端口的Tomcat进程。

   使用命令:netstat –apn


   发现8080端口被PID为9658的Java进程占用。

   进一步使用命令:ps -aux | grep java,或者直接:ps -aux | grep pid 查看

   就可以明确知道8080端口是被哪个程序占用了!然后判断是否使用KILL命令干掉!


   方法二:直接使用 netstat   -anp   |   grep  portno
   即:netstat –apn | grep 8080


9.  Linux 下日志的分割,使用linux自带的 logrotate


10. Tomcat 的远程 debug

     找到tomcat/bin/catalina.out 加上下面这一句

    declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999"



11. Spring quartz 定时任务

    为什么有的时候一部署到tomcat定时任务就启动,有时候就不会??

   假如设定的是每10分钟一次,现在的时间是15:10分,现在部署就会立即启动,定时任务参照的是系统时间


12. Hibernate中createSQLQuery 取值ClassCastException


Query query = sessions.createSQLQuery("select * from Diary");
       List<Diary> list = query.list(); 
       System.out.println(list.get(0).getLid());


       取值会出现ClassCastException 强制转换错误.

       正确写法

List<Diary> list = sessions.createSQLQuery("select * from Diary").addEntity(Diary.class).list();
       System.out.println(list.get(0).getLid());



13. Spring 的 Quartz 定时任务,当Tomcat 有 start,stop,reload 操作时,整个Tomcat下的定时任务都会停止

      这是因为定时任务所关联的JAR包都在Tomcat上面,当几个应用共用Tomcat里面的JAR包时候,Tomcat 一有相关操作,定时任务就会报出找不到方法的错误,然后就自动停止

      解决办法: 定时任务把相关JAR包添加到自己的项目底下,不要共用JAR包



14. 奇怪的奇数判断问题

     x % 2 == 1

     这个只能用来判断正奇数,比如:1 3 5 7 9

     要判断: -1 -3 -5

     必须这样写: x &1  ==1 or     x %2 != 1


15. if(list.size()>0&&list!=null)    假如 list=null ,list.size()就会直接报错,建议把if里面的判断条件呼唤位置,先判断是否为空,再判断长度


16. 文件传送问题,FTP

    文件正在上送或者正在读取,其他程序是不能转移或者改名


17.关于换行符


Linux和Unix系统的换行是"\n",而Windows的换行并不是直接的"n",是"\r\n"。所以out.write("\n")只能得到一个黑框,因为Windows不认为这是个“换行”。   直接从记事本输入的话,Windows自动输入了"\r\n",所以从从文本文件中读出来的也是"\r\n",可以正常显示。

那么这是为什么呢?稍微学过正则表达式的朋友都知道:\r是回车符,而\n是换行符。Windows默认\n在文档中显示的是一个空格或者小黑框。所以,要先回车,再换行。

13是回车 \r 将光标移动到 当前行的前面(此时插入符的纵坐标没有改变)
10换行 \n 将光标移动到 下一行(此时插入符的横坐标没有改变)
回车的本质就是将插入符移动到屏幕最左边。
插入符就是咱们说的光标.

windows linux中的换行 是不一样的  
linux System.getProperty("line.separator");


18. 关于hibernate加载实体类问题

    由于数据库某张表没有设置主键,但是映射的实体类设置了主键

    那张表有多条数据对应实体类的主键相同,但是某个属性不一样,在Hibernate查询记录时,由于主键相同,所以取了第1条,其他数据都一样,Hibernate直接从缓存区取数据

  PS:解决办法,数据库设主键,或者把表多属性设置成主键,或者Hibernate通过sql语句查询的时候生成Dto.



19.Socket


ServerSocket.setSotimeout()    // 服务端设超时,只能判断连接超时,就是特定时间内有没客户端连接进来

   Socket.setsotimeout()            //客户端设超时。判断读写超时,就是特定时间内客户端有没读写数据,没有就抛出读写超时异常


   判断是否连接超时,连接异常

try {

socket.sendUrgentData(0xFF);

} catch (Exception ex) {

if (socket != null)

socket.close();

}




20.随机更新  数据库中N条记录

   1.  随机取得表中任意N条记录的方法

       select top N * from table_name order by newid() 

   2.随机更新记录

declare @cardid varchar(20)

select top 1 @cardid=cardid from ic_inline order by newid()

select @cardid

update ic_inline set settlmtdt='20121022' where cardid = @cardid

 3;取随机数

   select floor(rand()*N) ---生成的数是这样的:12.0  

   select cast( floor(rand()*N) as int) ---生成的数是这样的:12  


21.关于HQL的select new 对象

    select new com.hxsmart.sicard.core.webapp.model.card.SiInfoHzDto" +

   "(n.id.interfaceid,n.region,n.insuredid,n.name,n.sex)");

   属性不能为空,要不会抛出could not instantiate: com.hxsmart.sicard.core.webapp.model.card.SiInfoHzDto错误


22. Hibernate

     save 方式保存,先更新,再保存,有重复对象就更新保存

     insert 不能有重复对象



23.生成PDF的时候,要用 才能显示东西



24.关于数据库中存有datetime类型,比如    2012-10-10  12:34:56

   直接select * from ic_text where time = '2012-10-10 12:34:56'

    这是查不出结果的,必须如下

select * from ic_text where time >= '2012-10-10 00:00:00' and time <= '2012-10-10 23:59:59'


   在java里面就这样:

   String startdate = DateUtil.formatDateToString(date, "yyyy-MM-dd")+" 00:00:00";

   String enddate = DateUtil.formatDateToString(date, "yyyy-MM-dd")+" 23:59:59";

   hql.append("from InsuredRollbatch where proctm >='").append(startdate).append("' and proctm<='").append(enddate).append("'");


25. 关于Hibernate 采用内连接还是外连接问题

    外连接影响的性能十分大,最好关掉外连接

   Hibernate:

hibernate.cfg.xml

hibernate.max_fetch_depth = 0

 JPA

@OneToOne(optional=false)


26.关于hibernate 打印 sql语句

<!--显示的sql语句格式化-->

   <property name="hibernate.show_sql">true</property>

   <!--使显示的sql语句-->

<property name="format_sql">true</property>


27. java Runtime.getRunTime.exec(String command)的使用

当要调用一个外部程序的时候,java提供了exec方法,具体用法是:Runtime.getRunTime.exec("cmd /C Start mailto: abc@xxx.com").其中cmd /c是调用cmd下的start命令,它相当于对一个文件双击。也可以用Runtime.getRunTime.exec("c:\\EXCEl.exe d:\\a.xls")来打开D盘下的excel文件.  



28. Hibernate 无主键映射问题

   数据库表中如果没有主键,那么HIBERNATE就不应该设置主键映射,就拿最基本的查询来说.如果你改成有主键表映射文件的形式,那么Table中的custid如果有相同值的话,你从Dao中查出来的数据.凡是custid相同的数据.都会显示同一条,这不是我们想要的结果.

用hibernate开发要注意数据库中的每张表都应该有一个主键的。

  可以无主键的,无主键就是所有的列联合成为一个主键,映射后会多出一个Java文件是表名id.java文件,意思是封装过了的表存入id那个类中


29.Hibernate 映射问题

     实体类对应表结构,字段数量可以小于等于表的字段,但是不能大于表中存在的字段

    比如table1,里面有name,sex,id

   那么实体类 table1.java 可以有name,sex映射,但是不能多出一个不存在的字段,比如address


30,Hibernate 保存

   hibernate保存的时候,联合主键里面的字段可以为空


31.关于hibernate联合主键查询语句返回值为空的问题

在hibernate中,配置在组合主键中的字段,若只要有一个的值为null那么,hibernate会将整行对应的实体置为null。

    如果表字段为空,映射到实体类,字符类型为=NULL,数值类型为=0

    但是如果表的字段对应到实体类是联合主键,假如其中一个是NULL,比如说table.name 是空,那么映射到实体类打印的时候就会报错



32. 惠州交换的关于资金划拨,其中一张表木有主键的问题

zrpch number(12),       /*注入批次号*/

   grsxh  NUMBER(12),      /*人员编号 唯一索引,惠州变更,河源是aac001 N(20)*/  

   sfzh   VARCHAR2(18),    /*身份证号惠州变更,河源是aac002*/

   zrzje number(12,2),     /*注入总金额*/

   zrdwje number(12,2),    /*注入单位金额*/

   zrgrje number(12,2),    /*注入个人金额*/

   jfny number(8),         /*缴费年月*/

   ssny number(8),         /*所属年月*/

   zrsj number(16),        /*注入时间*/

   xzlx   VARCHAR2(3),     /*险种类型  50综合基本医疗

   xwxh   VARCHAR2(20),/*未知  惠州新增*/

   xtjgdm VARCHAR2(4)/*系统机构代码 惠州新增*/


         表中没有主键,得知,hibernate 做实体映射,必须得有一个ID,或者一个联合主键,网上资料查明,假如数据库表中没有主键,可以通过HIBERNATE把所有属性

设置为联合主键,但是这样会出现问题,联合主键其中一个属性为空,那么这个对象就为空,不可取,所以办法就是不要实体映射,直接弄一个表相对应的JAVA BEAN

DAO层这样写:


String sql = "select * from SYSDBA.YB_GRZHZR_DATA_GFH y where y.zrpch="+batchid+"";
List dtlList = getSession().createSQLQuery(sql).list();
try {
    List<YbGrzhzrData> ybList = new ArrayList<YbGrzhzrData>();
    YbGrzhzrData yb = null;
for(int i=0;i<dtlList.size();i++){
    yb = new YbGrzhzrData();
    Object[] ob = (Object[]) dtlList.get(i);
    yb.setZrpch((BigDecimal)ob[0]);//注入批次号
    yb.setGrsxh((BigDecimal)ob[1]); //个人顺序号
    yb.setSfzh((String)ob[2]);//身份证
    yb.setZrzje((BigDecimal)ob[3]); //注入总金额
    yb.setZrdwje((BigDecimal)ob[4]); //注入单位金额
    yb.setZrgrje((BigDecimal)ob[5]); //注入个人金额
    yb.setJfny((BigDecimal)ob[6]);//缴费年月
    yb.setSsny((BigDecimal)ob[7]);//所属年月
    yb.setZrsj((BigDecimal)ob[8]);//注入时间
    yb.setXzlx((String)ob[9]);//险种类型
    ybList.add(yb);
}
    return ybList;
} catch (Exception e) {
    System.out.println("获得划拨明细记录出错,转换异常:"+e.getMessage());
    return null;
    }
}


33. 如何做权限控制

   1. 要有用户,角色,还有权限表

      为角色赋予 管理员,普通人员等,每个人都有不同的权限,然后再把用户赋予



34. Sql 赋值问题

    declare @a int

    select @a = 1,

               @a = @a +1

    select @a

   这里会打印出控制,原因是第2行和第3行挤在一起写,第二次取的变量还没有初始化,正确写法如下

   declare @a int

   select @a = 1

   select @a = @a +1

   select @a


35. 关于socket的收发形式

   遇到社保局发送查询信息,半天没反应,原始是

    如果SocketA接受的方式是按行形式,那么SocketB发送给SocketA的时候,一定要在末尾加换行符号

    最标准的收发形式应该在报文前加长度,这样收报文的时候截取前面的长度,然后再截取内容

   如果按照行方式,在内容里面不小心加了一个换行,那就出错了!~


36. 如果hql 用 select new的形式

   那么select new test

   这个test如果不是实体类,是Pojo类,那就要加包名,select new cn.dxy.test()

   而且这个test要有无参构造函数,int要变成integer,要序列化


37. 在sybase15.7上面有个漏洞,每次建库之后赋予DBO权限,数据库就会重建,解决办法如下:

1 设置可以更改系统表

sp_configure 'allow updates to system tables',1

2 把master里面的系统表  sysdatabases 里面的属性 durability 改成1,注意



38. SYBASE 数据库某个字段是vchar 60宽度, ORACLE也是VCHAR2 60宽度

   但是把SYBAES移动ORACLE报错   当前值66,最大值60

   经发现,ORACLE的字符集是ALU32UTF8,是UTF8字符集,一个中文占用3个字节,最大只能存20个中文

   解决办法:  赋值的时候,把超出20个中文的截出



39. 数据库某个字段是 char类型,比如说 name char()  ;  name="12345"

    但是在hibernate中用  createSqlQuery查询的时候,返回的是"1",只返回前面的,解决办法,增加 addScaler

   String hql = "select trandt from ic_inline as line where line.tradetype !='0701'";

   List<String> dl = getSession().createSQLQuery(hql).addScalar("trandt",Hibernate.STRING).list();


40. Hibernate  getSession一定要关闭,

   而且不能这样关: getSession.close();

   正确关闭方法:  1. Session session = getSession();  session.close();

                              2. releaseSession(session)



转载于:https://my.oschina.net/samtribiani/blog/145420

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值