mysql创建表,默认系统当前时间 2C

CREATE TABLE tmp_webservice_sql_log (
ID INT(10) NOT NULL AUTO_INCREMENT,
SEND_DATA_TIME DATETIME DEFAULT NULL,
SEND_STATE VARCHAR(10) DEFAULT NULL,
INTER_NAME VARCHAR(100) NOT NULL,
CREATE_TIME DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
QUERY_SQL TEXT,
SEND_JSON LONGTEXT,
RETURN_JSON VARCHAR(2000) DEFAULT NULL,
SYS TINYINT(2) DEFAULT NULL,
PRIMARY KEY (ID,INTER_NAME,CREATE_TIME)
) ENGINE=INNODB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8

create_time 字段和 QUERY_SQL字段SEND_JSON字段 报错

2个回答

你用的什么连接工具连的mysql,我用SQLyog连执行你的语句没有报错,建表成功了。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在并发下,Spring已经提交事务,并且释放JDBC连接后,新的事务无法查询到之前事务添加的数据
############这里创建了一个事务 35ea154e 2020-01-11 11:13:47.834 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Creating new transaction with name [com.framework.code.service.report.RPatientService.registerPS]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 2020-01-11 11:13:47.836 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Acquired Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] for JDBC transaction ########切换JDBC事务并且交给Spring管理 2020-01-11 11:13:47.837 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Switching JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] to manual commit ############参与当前的事务 35ea154e 2020-01-11 11:13:47.837 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Participating in existing transaction 2020-01-11 11:13:47.838 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RUserMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] #######通过openid查询用户 2020-01-11 11:13:47.838 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RUserMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, VxHeadUrl_, VxNickName_, VxSex_, VxOpenid_, VxProvince_, VxCity_, VxCountry_, Type_, PromotionSource_ from r_user WHERE ( VxOpenid_ = ? ) 2020-01-11 11:13:47.839 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RUserMapper.selectByExample | ==> Parameters: oMGuv5uRcp03ycIgyjclwpZfr1Eg(String) ##########使用当前事务35ea154e 2020-01-11 11:13:47.842 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] #######根据用户Id查询患者信息 2020-01-11 11:13:47.842 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, RUserId_, RegisterTime_, Name_, Phone_, CardNo_, Age_, Illness_, Irritability_, Inheritance_, IsBindFinished_, Sex_, VxHeadUrl_, PfksShopUserId_ from r_patient WHERE ( RUserId_ = ? ) 2020-01-11 11:13:47.843 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ==> Parameters: 458690345937539120(Long) #############这里表示使用AOP调用其他的事务,判断当前有事务,那么默认直接使用当前事务 2020-01-11 11:13:47.844 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Participating in existing transaction ############继续使用当前事务 35ea154e 2020-01-11 11:13:47.845 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RDoctorMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] #######通过医生Id查询医生信息 2020-01-11 11:13:47.845 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RDoctorMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, RUserId_, Name_, NamePY_, RHospitalId_, RDepartmentId_, PositionCode_, Phone_, RegisterTime_, CheckStatus_, CheckTime_, CheckUserName_, CheckRemark_, Speciality_, Profile_, VxHeadUrl_, Dtype_, PfksShopUserId_, RDocCareType_ from r_doctor WHERE ( Id_ = ? ) 2020-01-11 11:13:47.846 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.doctor.RDoctorMapper.selectByExample | ==> Parameters: 463413442003472478(Long) #############再次使用AOP调用其他的事务,判断当前有事务,那么默认使用当前事务 2020-01-11 11:13:47.849 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Participating in existing transaction #########继续使用当前事务 35ea154e 2020-01-11 11:13:47.851 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] #########通过医生ID和患者的ID查询医患报道表的信息 2020-01-11 11:13:47.852 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, RPatientId_, RDoctorId_, CreateTime_, IMSessionId_, IllnessName_, RDoctorNameRemark_, RPatientNameRemark_ from r_report WHERE ( RDoctorId_ = ? and RPatientId_ = ? ) 2020-01-11 11:13:47.853 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.selectByExample | ==> Parameters: 463413442003472478(Long), 458690345958510641(Long) ##############继续使用当前事务 35ea154e 2020-01-11 11:13:47.854 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.insert | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] #############添加医患报道表的一条记录 患者ID=458690345958510641 IMSessionId_是null ,这里添加的数据在下面的事务中查询不到,等我到数据去查询却能查询到结果 2020-01-11 11:13:47.857 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.insert | ==> Preparing: insert into r_report (Id_, RPatientId_, RDoctorId_, CreateTime_, IMSessionId_, IllnessName_, RDoctorNameRemark_, RPatientNameRemark_) values (?, ?, ?, ?, ?, ?, ?, ?) 2020-01-11 11:13:47.858 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.mapper.report.RReportMapper.insert | ==> Parameters: 481834561777569793(Long), 458690345958510641(Long), 463413442003472478(Long), 2020-01-11 11:13:47.853(Timestamp), null, null, null, null ###########这里输出的日志 2020-01-11 11:13:47.861 | myHost | INFO | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | com.framework.code.service.report.RReportService | new report generate:{"id":481834561777569793,"rpatientid":458690345958510641,"rdoctorid":463413442003472478,"createtime":1578712427853,"imsessionid":null,"illnessname":null,"rdoctornameremark":null,"rpatientnameremark":null} ########提交启动的事务 2020-01-11 11:13:47.861 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Initiating transaction commit #########这里我们新创建一个新的事务 7fb1091a 2020-01-11 11:13:47.861 | myHost | DEBUG | pool-1-thread-7 | [] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Creating new transaction with name [com.framework.code.service.report.RPatientService.registerEvent]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT ########之前线程的事务进行提交 2020-01-11 11:13:47.861 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Committing JDBC transaction on Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] ################这里是我们新的事务 7fb1091a 2020-01-11 11:13:47.862 | myHost | DEBUG | pool-1-thread-7 | [] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Acquired Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] for JDBC transaction 2020-01-11 11:13:47.862 | myHost | DEBUG | pool-1-thread-7 | [] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Switching JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] to manual commit ######这里是日志输出 2020-01-11 11:13:47.862 | myHost | INFO | pool-1-thread-7 | [] | com.framework.code.service.report.RPatientService | [PatientEvent]:{"rUserId":458690345937539120,"rDoctorId":463413442003472478} ##########使用当前事务 2020-01-11 11:13:47.862 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.doctor.RUserMapper.selectByPrimaryKey | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] ##########通过用户Id查询用户信息 2020-01-11 11:13:47.862 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.doctor.RUserMapper.selectByPrimaryKey | ==> Preparing: select Id_, VxHeadUrl_, VxNickName_, VxSex_, VxOpenid_, VxProvince_, VxCity_, VxCountry_, Type_, PromotionSource_ from r_user where Id_ = ? 2020-01-11 11:13:47.863 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.doctor.RUserMapper.selectByPrimaryKey | ==> Parameters: 458690345937539120(Long) ######之前的线程释放JDBC连接 2020-01-11 11:13:47.867 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Releasing JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@5c225ae5 [wrapping: com.mysql.jdbc.JDBC4Connection@35ea154e]] after transaction 2020-01-11 11:13:47.867 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.jdbc.datasource.DataSourceUtils | Returning JDBC Connection to DataSource 2020-01-11 11:13:47.867 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.web.servlet.DispatcherServlet | Completed 200 OK 2020-01-11 11:13:47.867 | myHost | INFO | pool-1-thread-8 | [] | com.framework.web.eventbus.LogSubscribe | [LogSubscribe]:{"threadName":"http-nio-8081-exec-10","className":"com.framework.code.controller.webchat.WeChartController","methodName":"receiveEvent","argsMap":{"request":"ServletRequest","response":"ServletResponse"},"argsJson":"{\"request\":\"ServletRequest\",\"response\":\"ServletResponse\"}","happenTime":1578712427867,"throwable":null,"throwableString":null,"traceId":"436ed24f998d411ab5150b1258b22cd0","result":null,"useTime":33} 2020-01-11 11:13:47.867 | myHost | DEBUG | http-nio-8081-exec-10 | [436ed24f998d411ab5150b1258b22cd0] | org.springframework.session.web.http.SessionRepositoryFilter.SESSION_LOGGER | No session found by id: Caching result for getSession(false) for this HttpServletRequest. ########使用当前事务 7fb1091a 2020-01-11 11:13:47.867 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] ###通过用户ID查询患者信息 2020-01-11 11:13:47.867 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, RUserId_, RegisterTime_, Name_, Phone_, CardNo_, Age_, Illness_, Irritability_, Inheritance_, IsBindFinished_, Sex_, VxHeadUrl_, PfksShopUserId_ from r_patient WHERE ( RUserId_ = ? ) 2020-01-11 11:13:47.869 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByExample | ==> Parameters: 458690345937539120(Long) ##########使用AOP调用其他的事务,判断当前有事务,那么默认使用当前事务 7fb1091a 2020-01-11 11:13:47.870 | myHost | DEBUG | pool-1-thread-7 | [] | org.springframework.jdbc.datasource.DataSourceTransactionManager | Participating in existing transaction 2020-01-11 11:13:47.876 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByPrimaryKey | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] ######通过用户ID查询患者信息 2020-01-11 11:13:47.876 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByPrimaryKey | ==> Preparing: select Id_, RUserId_, RegisterTime_, Name_, Phone_, CardNo_, Age_, Illness_, Irritability_, Inheritance_, IsBindFinished_, Sex_, VxHeadUrl_, PfksShopUserId_ from r_patient where Id_ = ? 2020-01-11 11:13:47.876 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RPatientMapper.selectByPrimaryKey | ==> Parameters: 458690345958510641(Long) ##########使用当前事务 7fb1091a 2020-01-11 11:13:47.878 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RReportMapper.selectByExample | ooo Using Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@75935acf [wrapping: com.mysql.jdbc.JDBC4Connection@7fb1091a]] ##########通过患者ID查询患者报道信息表 458690345958510641 2020-01-11 11:13:47.878 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RReportMapper.selectByExample | ==> Preparing: select 'true' as QUERYID, Id_, RPatientId_, RDoctorId_, CreateTime_, IMSessionId_, IllnessName_, RDoctorNameRemark_, RPatientNameRemark_ from r_report WHERE ( RPatientId_ = ? and IMSessionId_ is null ) 2020-01-11 11:13:47.878 | myHost | DEBUG | pool-1-thread-7 | [] | com.framework.code.mapper.report.RReportMapper.selectByExample | ==> Parameters: 458690345958510641(Long) ########输出查询结果 2020-01-11 11:13:47.879 | myHost | INFO | pool-1-thread-7 | [] | com.framework.code.service.report.RReportService | 查询隐患报道关系.数量只能有一条:0记录信息=[] 这里查询到结果是0个,说明之前的数据并没有落入DB中???这是因为spring提交事务后落入DB还有时间嘛,操作了这样的时间差。
mysql的问题,大家看一下嘛,谢谢
mysql方面的 第一题:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 第二题:还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA程序里面获得这条记录的ID. [b]问题补充:[/b] 18,因为你没有把mysql归0 =========================== 但是那个面试我的人告诉我是15啊。。 还有MYSQL怎么归0啊 [b]问题补充:[/b] 第一题,面试的人告诉我的说是15,还是这个是MYSQL的XX机制,还说MYSQL可能会才产XX数据的原因所在 [b]问题补充:[/b] 面试的人不一定技术都是很厉害的,我最烦的是那些SB从网络抄一题,自己都没有验证过,来考应聘人员。。。我是这么认为,这么多年来,经历那么多面试,真正懂技术没有几个,真正能够和他谈技术的,我的印象中仅一人。 ========================================================= 哇,我去验证下嘛,是不是MYSQL版本的问题呢?有的版本就是15有的版本就是18呢。。。还有MYSQL是要重启的,重启了之后再INSERT [b]问题补充:[/b] 人家是是把MYSQL重启啊,不是把表truncate t_test; [b]问题补充:[/b] 谢谢大家。。。。 [b]问题补充:[/b] wcily123大哥,我说了,删了数据之后,[color=red]MYSQL要重启啊。。。[/color] [b]问题补充:[/b] 如果表的类型是MyISAM,那么是18。 因为MyISAM表会把自增主键的最大ID记录到数据文件里,重启MySQL自增主键的最大ID也不会丢失。 如果表的类型是InnoDB,那么是15。 InnoDB表只是把自增主键的最大ID记录到内存中,所以重启数据库或者是对表进行OPTIMIZE操作,都会导致最大ID丢失。 (防止因OPTIMIZE操作丢失最大ID的方法,我写了一篇博客,请参看http://ilgnep.iteye.com/blog/317343) 个人感觉,使用的InnoDB的多一些。 MyISAM表和InnoDB表怎么创建,怎么看表是InnoDB还是MyISAM [b]问题补充:[/b] [color=red]MyISAM表和InnoDB表怎么创建,怎么看表是InnoDB还是MyISAM [/color] [b]问题补充:[/b] 晕了,去MYSQL官方看了一下,就一个表,就有这么多的类型啊。。。 [img]/upload/attachment/97387/25c4663f-77d0-3513-903c-3246d4cda874.jpg[/img] 。。。。。。 [b]问题补充:[/b] http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html [b]问题补充:[/b] 第一题:这个要看Mysql表的类型 我现在知道的有两种,一种是MyISAM,另一种是InnoDB MYSQL默认的就是InnoDB InnoDB是把表的主键最大值放到内存里面,所以MYSQL重启之后就会丢失(在WINDOW下,这是MYSQL默认的) MyISAM是把表的主键最大值放到文件里面,所以MYSQL重启之后不会丢失 可以在创建表的时候显示指定 [code="sql"]create table t_test(id int not null auto_increment primary key,name varchar(255)) ENGINE=InnoDB; 或 create table t_test(id int not null auto_increment primary key,name varchar(255)) ENGINE=MyISAM;[/code] 还可以通过 [code="sql"]SHOW TABLE STATUS;[/code]命令可以看到表的类型 使用ALTER命令可以对单个表的类型进行修改 [code="sql"]ALTER TABLE talbe_name ENGINE=InnoDB; [/code] 用 [code="sql"]SHOW GLOBAL VARIABLES LIKE '%engine%';[/code] 可以看到MySQL当前默认的新生成表的类型。 第二题: 有两种方法, 1.JDBC有这个API,Statement.getGeneratedKeys(); 2.可以利用MySQL语句获得,但这个就不是通用语句了:SELECT LAST_INSERT_ID(); 以上是总结,大家看一看有什么问题没有,谢谢大家了,那个MySQL-Front 就算了嘛,我要的话我去网上搜一下就应该下载的到啥。。 感谢所有网友 在这里还要特别感谢: huangnetian,hantsy,lovewhzlq,LucasLee,wcily123,秦朝古月等等 [b]问题补充:[/b] http://langhua9527.iteye.com/blog/374113
各位大佬,关于PHP转换json之后,js接收报错,求解!
我的测试代码,在自己电脑上运行是运行的 ``` <?php // header("content-type:text/html;charset=utf-8"); // header("Access-Control-Allow-Origin:*"); // header('Access-Control-Allow-Methods:POST'); // header('Access-Control-Allow-Headers:x-requested-with, content-type'); // header("Content-Security-Policy: upgrade-insecure-requests"); require_once(dirname(__FILE__) . './db-test/config.php'); header("Content-type: text/html; charset=utf-8"); error_reporting(0); //创建数据库连接 $mysqli = new Mysqli($dbhost, $dbuser, $dbpass, $dbname); if ($mysqli->connect_error) { die('connect error:' . $mysqli->connect_errno); } $method = !empty($_REQUEST['method']) ? trim($_REQUEST['method']) : ''; //获取时间 if ($method == "query") { $begin_time = $_GET['begin_time']; $begin = $begin_time; $finish_time = $_GET['finish_time']; $finish = $finish_time; //转换为时间戳 $begin_time = strtotime($begin_time); $finish_time = strtotime($finish_time); $selected = $_GET['selected']; //选择的 if ($selected=="jiaye"){ $sql = "SELECT * FROM wx_user where source <>'yunfeng' AND (subscribe_time>('$begin_time')) and subscribe_time<'$finish_time' ;"; }else{ $sql = "SELECT * FROM wx_user where source='yunfeng' AND (subscribe_time>('$begin_time')) and subscribe_time<'$finish_time';"; } $result = $mysqli->query($sql); $results = array(); while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $results[] = $row; } $arr = json_encode($results,JSON_UNESCAPED_UNICODE); //echo($arr); } else { //默认筛选 //上个月的时间戳 $last_month = strtotime(date('Y-m-01 00:00:00',strtotime('-1 month'))); //获取今日开始时间戳和结束时间戳 $endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1; $result = $mysqli->query("select * from wx_user where source='yunfeng' AND (subscribe_time>('$last_month')) and subscribe_time<'$endToday' "); $results = array(); while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { $results[] = $row; } $arr = json_encode($results,JSON_UNESCAPED_UNICODE); } ?> <html> <head> <!-- 设置HTML5编码--> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport"> <!-- 设置HTML5编码--> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <!-- <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"/> --> <title>用户关注数据</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <link href="https://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css" rel="stylesheet"> <link href="//cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.css" rel="stylesheet"> <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> <script src="https://unpkg.com/tableexport.jquery.plugin/tableExport.min.js"></script> <script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script> <script src="https://cdn.bootcss.com/moment.js/2.18.1/moment-with-locales.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script> <script src="//cdn.bootcss.com/bootstrap-table/1.11.1/bootstrap-table.js"></script> <script src="//cdn.bootcss.com/bootstrap-table/1.11.1/locale/bootstrap-table-zh-CN.js"></script> <style> .Connection { display: inline-block; position: relative; margin: 0 5px 0 0; } </style> </head> <body> <h2 class="text-center"> <?php $selected = $_GET['selected']; if ($selected=="jiaye"){ echo "嘉业关注用户"; }else{ echo "云蜂关注用户"; } ?> </h2> <div class="Connection"> <div class="cell-left"> </div> </div> <div class="Connection"> <div class="cell-left"> <div class="form-group"> <select class="form-control" id="selected"> <option value="yunfeng">云蜂</option> <option <?php $selected = $_GET['selected']; if($selected==='jiaye'){ echo 'selected';}?> value="jiaye" >嘉业</option> </select> </div> 请选择起始日期: <input type='text' class="form-control" id='datetime1' style="width:200px; placeholder=" value="<?php echo $begin; ?>"""/> </div>       </div> <div class="Connection"> <div class="cell-left"> 请选择结束日期: <input type='text' class="form-control" id='datetime2' style="width:200px; placeholder=" value="<?php echo $finish; ?>"""/> </div>    </div> <div class="Connection"> <div class="cell-left"> <button class="btn btn-default" onclick="GetTime()">提交</button>    </div>   </div> <div class="Connection"> <div class="cell-left">     <button class="addBtn btn btn-default" id="exportTable"> 导出当前表格数据 </button>     </div>     </div> <script> function trim(str){ return str.replace(/(^\s*)|(\s*$)/g, ""); } $(function () { $("#datetime1").datetimepicker({ format: 'YYYY-MM-DD ', locale: moment.locale('zh-cn') }); $("#datetime2").datetimepicker({ format: 'YYYY-MM-DD ', locale: moment.locale('zh-cn') }); }); var new_data = ""; function GetTime() { var selected= $("#selected").val(); var a = $(" #datetime1").val(); var b = $(" #datetime2").val(); var a= trim(a); var b= trim(b); // alert("第一个输入框" + a) //alert("第二个输入框" + b) location.href = "admin_weixin_subscribe_yunfeng.php?method=query&selected="+selected+"&begin_time=" + a + "&finish_time=" + b; } </script> <div class="table-responsive"> <table id="mytab" class="table table-striped table-bordered"> </table> </div> <script type="text/javascript"> var arr =<?php echo $arr;?>; $(function () { $('#mytab').bootstrapTable({ data: arr, dataType: 'json', queryParams: "queryParams", showColumns: true, //测试 新加 //showRefresh: true, //是否显示刷新按钮 toolbar: "#toolbar", //工具按钮用哪个容器 // editable:true; editable: true, clickEdit: true, showExport: true, sidePagination: "true", //分页方式:client客户端分页,server服务端分页(*) //striped: true, // 是否显示行间隔色 search: true, method: 'GET', //请求方式(*) //search : "true", //是否显示表格搜索 uniqueId: "ID", //每一行的唯一标识,一般为主键列 pageSize: "20", pageList: [10, 25, 50, 100, 'All'], //可供选择的每页的行数(*) pagination: true, // 是否分页 sortable: true, // 是否启用排序 clickToSelect: true, //是否启用点击选中行 columns: [ [{ "title": "<?php $selected = $_GET['selected']; if ($selected=="jiaye"){ echo "嘉业关注用户"; }else{ echo "云蜂关注用户"; } ?>", "halign": "center", "align": "center", //合体了5个列 "colspan": 13 } ], [{ field: 'openid', title: 'openid', sortable: true }, { field: 'nickname', title: '用户昵称', sortable: true, }, { field: 'userid', title: '序号', sortable: true, }, { field: 'subscribe_time', title: '时间戳', sortable: true, }, { title: '最后关注时间',//标题 可不加 edit: false, sortable: true, formatter: function (value, row, index) { return new Date(parseInt(row.subscribe_time) * 1000).toLocaleString().replace(/:\d{1,2}$/, ' '); } }, { field: 'sex', title: '性别', sortable: true, }, { field: 'language', title: '国别', sortable: true, }, { field: 'city', title: '所在国家', sortable: true, }, { field: 'province', title: '所在省份', sortable: true, }, { field: 'country', title: '所在城市', sortable: true, }, { field: 'mark', title: '备注', sortable: true, }, { field: 'subscribe_scene', title: '添加渠道', sortable: true, }, ] ] }); $("#exportTable").click(function () { //导出 $("#mytab").tableExport({ type: "excel", escape: "false", fileName: 'XX-XX关注信息' }); }); }); </script> </body> </html> ``` 运行结果:![图片说明](https://img-ask.csdn.net/upload/201907/08/1562576383_105519.jpg) 然后把代码放到公司服务器上,就报错![图片说明](https://img-ask.csdn.net/upload/201907/08/1562576482_194553.jpg) 非常非常奇怪、,,我看了数据库格式都是UTF-8 就是 script 那里不能把php解析的json给js 变量。。 求大佬帮助!!!!!! 为什么啊,我测试的时候都能 print出 json对象啊 header也加了 我觉得逻辑完全没问题啊啊啊啊
mysql 和proxool 数据库连接池的问题(连接定时递增)
我在Struts2.0 + Spring2.0 + hibernate3.2的应用中采用了proxool 数据库连接池。 proxool.xml的配置如下: <?xml version="1.0" encoding="utf-8"?> <something-else-entirely> <proxool> <alias>test</alias> <driver-url>jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&amp;characterEncoding=utf-8</driver-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <driver-properties> <property name="user" value="root"/> <property name="password" value="root"/> </driver-properties> <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql> <house-keeping-sleep-time>90000</house-keeping-sleep-time> <prototype-count>5</prototype-count> <maximum-connection-count>100</maximum-connection-count> <minimum-connection-count>10</minimum-connection-count> </proxool> </something-else-entirely> 在applicationContext.xml中 <!-- Hibernate-Spring配置 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingResources"> <list> <value>com/test/User.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.connection.autocommit">true</prop> <prop key="hibernate.connection.release_mode">after_statement</prop> <prop key="hibernate.bytecode.use_reflection_optimizer">true</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</prop> <prop key="hibernate.proxool.xml">proxool.xml</prop> <prop key="hibernate.proxool.pool_alias">test</prop> </props> </property> </bean> MySqL 的 my.ini 配置参数 max_connections=500 interactive_timeout=10000000 wait_timeout=10000000 proxool 的 maximum-connection-lifetime(连接最大生命时间)默认4小时,发现每隔4个小时,通过show status命令查看MySQl 的Connections 增加10个,很快就会到达max_connections的最大限制,虽然可以把max_connections设置为16000,但是这只是延长出问题的时间而已。请各位遇到这样情况的朋友指导如何解决? MySQL 版本5.0和4.1都试过,proxool 版本为 proxool-0.9.0RC3。 [b]问题补充:[/b] 蔡华江:谢谢指点。我在数据库的查询、更新等方面都是通过hibernate来完成的,如查询用户 public User findUserByUsername(String username) { String queryStr=PropertyOwner.getKeyValue("getuserwithname"); Session session = this.getSession(); Query query=getQuery(queryStr,session); query.setString("username", username); if(query.list().size()>0) { User tmp=(User)query.list().get(0); this.closeSession(session); return tmp; } else { this.closeSession(session); return null; } } 在程序的最后都有this.closeSession(session);这样的语句,难道数据连接没有关闭? [b]问题补充:[/b] 现在我怀疑是 this.closeSession(session); 没有关闭连接。因为Session session = this.getSession(); 利用getSession强制获得了Hibernate的 Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session 进行关闭。参考“spring整合hibernate关于session的管理”(http://solodu.iteye.com/blog/454469),我修改Session session = super.getSession(true);运行10分钟后还是递增连接。说明还有其他的数据库连接没有释放。查看Proxool的监控界面可以看到连接情况0 (active), 10 (available), 100 (max)。 我怀疑一个定时保存的地方有问题 try { otherDAO.updataOrSave(tmpp); } catch (Exception e) { } ......>跟踪 public void updataOrSave(T domainObject) throws Exception { saveOrUpdate((Object)domainObject); } ......>继续跟踪 protected void saveOrUpdate(final Object obj)throws Exception { run ( new TransactionRunnable () { public Object run (Session s) { saveOrUpdate(obj, s); return null; } }); } ......>继续跟踪 protected void saveOrUpdate(Object obj, Session s) { s.saveOrUpdate(obj); } 请问上述代码有问题吗? [b]问题补充:[/b] 现在我把定时保存部分关闭了,照样有此问题。 [b]问题补充:[/b] 经过多次试验,增加连接的地方是类似这样的hibernate的操作 public History queryHistory(String queryStr,String entity,Date time) { Session session = this.getHibernateTemplate().getSessionFactory().openSession();//该句照样增加连接数 //getSession();//该句照样增加连接数 Query query=super.getQuery(queryStr,session); int size=query.list().size(); if(size>0) { History temp=(History)query.list().get(0); session.close(); return temp; } else { session.close(); return null; } } [b]问题补充:[/b] 现在问题是Proxool连接池里的连接ID老是递增(通过Proxool监控界面看),连接数是没有超过最大连接。请问各位好手如何解决啊? [b]问题补充:[/b] 这个问题竟然是我的理解错了。 MySQL的SHOW STATUS提供服务器的状态信息: Connections 试图连接MySQL服务器的次数,是不断增加,不是真正的目前连接数(与MySqL 的 my.ini 配置参数 max_connections无关,好多人都理解错误)。 真正有用的是下述几个 Threads_created 表示创建过的线程数,该值太大,就要增加my.cnf中thread_cache_size的值 Threads_connected 当前打开的连接的数量。 Threads_running 不在睡眠的线程数量。 Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 感谢蔡华江的指导。
spring mvc+shiro+cas 实现cas client功能 跳转回来404
http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404
有没有大神能指点一下哪里错了。。。。
package Frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import javax.swing.*; import db.DButil; public class login extends JFrame implements ActionListener{ private JPanel jp=new JPanel(); //创建标签数组 private JLabel[] jlArray={new JLabel("用户名"), new JLabel("密 码"),new JLabel("")}; private JButton jb1; private JButton jb2; private JButton jb3; private JTextField jtf=new JTextField(); private JPasswordField jpf=new JPasswordField(); //布局构造实现方法 public login(){ Icon icon1=new ImageIcon("login.jpg"); Icon icon2=new ImageIcon("reset.jpg"); Icon icon3=new ImageIcon("zhuce.jpg"); JPanel jp=new JPanel(){ protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); }}; jp.setLayout(null); jb1=new JButton(icon1); jb2=new JButton(icon3); jb3=new JButton(icon2); jlArray[0].setBounds(70,120,90,32); jb1.setBounds(365,110,130,60); jb2.setBounds(365,170,130,60); jlArray[1].setBounds(70,170,90,32); //将标签与按钮添加到JPanel容器中 jp.add(jlArray[0]); jp.add(jlArray[1]); jp.add(jb1); jp.add(jb2); jb1.addActionListener(this); jb2.addActionListener(this);//为按钮注册动作事件监听器 //添加修改密码的按钮 jb3.setBounds(365,230,130,60); jp.add(jb3); jp.add(jtf); jtf.setBounds(140,120,180,30);//设置文本框位置 jp.add(jpf); jpf.setBounds(140,170,180,30);//设置密码框位置 jpf.setEchoChar('*'); //密码显示字符形式 jpf.addActionListener(this); //为密码框注册动作事件监听器 this.setVisible(true);//设置窗体的可见性 jpf.addActionListener(this); //为密码框注册动作事件监听器 //设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器 jlArray[2].setBounds(70,220,300,30); jp.add(jlArray[2]); this.setTitle("登陆");//设置窗体标题 this.setBounds(450,200,500,318);//设置窗体的大小 this.setResizable(false);//设置窗体不让用户调整大小 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true);//设置窗体的可见性 this.add(jp);//将窗体添加到面板中 jp.setBackground(Color.blue); } public static void main(String[] args) { new login();//创建登陆窗体 } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //得到用户名与密码 String user=jtf.getText().trim(); String pwd=String.valueOf(jpf.getPassword());//返回密码的字符串表示方式 String sql=""; if(e.getSource()==jtf){//事件源为文本框,切换焦点到密码框 jpf.requestFocus(); } else if(e.getSource()==jb1||e.getSource()==jpf){ //判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd)){ //登陆成功 MainFrame mf=new MainFrame(jtf.getText());//主窗体 this.dispose(); } else{ //登陆失败 jlArray[2].setText("对不起,非法的用户名和密码"); this.clear(); } } else if(e.getSource()==jb2) {//事件源为注册按钮 if(user.equals("")||pwd.equals("")) {//如果注册的用户名为空或者密码为空 jlArray[2].setText("用户名和密码都不得为空!!!"); this.clear();//清空输入文本框 } else { sql="select uid from user where uid='"+user+"'"; if(DButil.isExist(sql)) {//用户名已经存在 jlArray[2].setText("对不起,用户名已存在!!!"); this.clear();//清空输入文本框 } else { sql="insert into user values('"+user+"','"+pwd+"')"; if(DButil.update(sql)>0) {//注册成功 jlArray[2].setText("恭喜您!!!注册成功,请登陆"); } } } } else if(e.getSource()==jb3)//修改密码的监听 { //判断是否已经输入用户名和密码 if(user.equals("")||pwd.equals("")) { jlArray[2].setText("修改密码先输入正确的用户名和密码!!!"); this.clear();//清空输入文本框 } //判断是否输入了正确的用户名和密码 else if(DButil.check(user,pwd)) { //正确的用户名和密码 String password=JOptionPane.showInputDialog(this,"修改密码:","请输入新密码", JOptionPane.PLAIN_MESSAGE); //得到新的密码为空 if(password==null||password.equals("")) { JOptionPane.showMessageDialog(this,"密码不得为空!!!","错误", JOptionPane.WARNING_MESSAGE); } else {//密码不为空 sql="update user set pwd='"+password+"' where uid='"+user+"'";//更新密码的SQL if(DButil.update(sql)>0) {//密码修改成功 this.clear();//清空输入文本框 jlArray[2].setText("恭喜您!!!密码修改成功,请用新密码登陆"); } } } else { JOptionPane.showMessageDialog(this,"用户名或者密码错误!!!","错误", JOptionPane.WARNING_MESSAGE); this.clear();//清空输入文本框 } } } package Frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import db.DButil; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import java.util.*; public class MainFrame extends JFrame implements ActionListener,ItemListener { private String uname=null;//当前用户的名字 private boolean isInsert=false;//是否为添加默认为否 private JPanel topjp=new JPanel();//界面上半部分的JPanel容器 private JButton jba=new JButton("模糊查询"); private JButton jbs=new JButton("查找"); private JTextField jtfs=new JTextField();//按给出信息查找联系人信息 private JRadioButton jrbxm=new JRadioButton("按姓名查找",true); private JRadioButton jrbbh=new JRadioButton("按学号查找",false); private ButtonGroup bg=new ButtonGroup();//单选按钮组 private JPanel jpbr=new JPanel();//单选按钮面板 private JPanel jpyInfo=new JPanel();//右侧显示个人信息的面板 private JTextArea jta=new JTextArea(); // 模糊查询得到的信息文本区 private JLabel[] jlInfo={new JLabel("学号:"),new JLabel("姓名:"), new JLabel("性别:"),new JLabel("出生日期:"), new JLabel("电话号码:"),new JLabel("QQ:"), new JLabel("Email:"),new JLabel("地址:"), new JLabel("添加相片")}; private JButton[] jbInfo={new JButton("编辑"),new JButton("保存"), new JButton("浏览"), new JButton("上传"),}; private JLabel jlPhoto=new JLabel();//显示图像的JLabel控件 private JTextField[] jtfInfo=new JTextField[10]; private JTextField jtfPhoto=new JTextField();//添加照片到相册的路径 private JFileChooser jfcPic=new JFileChooser();//上传图像的文件选择器 private DefaultTableModel tableModel; private JTable table; //性别部分 private JRadioButton jrbMale=new JRadioButton("男",true); private JRadioButton jrbFemale=new JRadioButton("女"); private ButtonGroup bgGender=new ButtonGroup(); private JPanel jpGender=new JPanel();//单选按钮面板 private JLabel jlDetail=new JLabel();//右侧显示一幅图片的标签 private JSplitPane jspOuter=//上下分割的JSplitPane new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //系统托盘部分 private PopupMenu popup=new PopupMenu(); private SystemTray tray;//定义SystemTray成员变量 private TrayIcon trayIcon;//定义TrayIcon成员变量 private MenuItem exit=new MenuItem("退出程序");//定义菜单 public void initJps() {//界面上半部分的初始化 topjp.setLayout(null);//设置topjp布局管理器为null //设置按钮大小并添加到JPanel面板里 jba.setBounds(5,10,120,26); jba.addActionListener(this);//为模糊查询按钮注册事件监听器 topjp.add(jba); jbs.setBounds(130,10,80,26); jbs.addActionListener(this);//为查找按钮注册事件监听器 topjp.add(jbs);//添加按钮到topjp面板里 //设置jtfs文本框大小并添加到jps面板里 jtfs.setBounds(215,10,120,26); jtfs.addActionListener(this);//为文本框注册事件监听器 topjp.add(jtfs); //设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里 jrbxm.setBounds(5,3,50,26); jrbxm.addItemListener(this);//为单选按钮注册ItemEvent事件监听器 bg.add(jrbxm); jpbr.add(jrbxm); jrbbh.setBounds(60,3,50,26); jrbbh.addItemListener(this); bg.add(jrbbh); jpbr.add(jrbbh); jpbr.setBounds(360,10,200,26); topjp.add(jpbr); } public void initInfo() {//初始化信息界面 jpyInfo.setLayout(null);//设置布局管理器为空 jpyInfo.setBounds(50,50,380,360);//设置信息面板的大小和位置 jlPhoto.setBounds(220,10,150,170);//设置联系人图像JLabel的大小和位置 jlPhoto.setBorder(BorderFactory.createLineBorder(Color.BLACK));//将JLbel的边框线显现出来 jpyInfo.add(jlPhoto);//将显示联系人照片的JLabel添加到信息面板 tableModel=new DefaultTableModel(); Vector vector1 = new Vector(); DButil db = new DButil(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); //table.addMouseListener((MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane js=new JScrollPane(table); //添加相片部分的控件 jtfPhoto.setBounds(80,250,200,26);//设置得到照片路径的文本框的大小和位置 jpyInfo.add(jtfPhoto);//将得到照片路径的文本框添加到信息面板 jbInfo[2].setBounds(285,250,80,26); jbInfo[2].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[2]); //上传按钮 jbInfo[3].setBounds(380,250,80,26); jbInfo[3].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[3]); for(int i=0;i<9;i++)//添加JLabel,并设置大小和位置 { jlInfo[i].setBounds(20,10+i*30,60,26); jpyInfo.add(jlInfo[i]); } for(int i=0;i<10;i++) {//初始化一些文本框 jtfInfo[i]=new JTextField(); } //学号 jtfInfo[0].setBounds(80,10,135,26); jpyInfo.add(jtfInfo[0]); //姓名 jtfInfo[1].setBounds(80,40,135,26); jpyInfo.add(jtfInfo[1]); //出生日期 jtfInfo[3].setBounds(80,100,135,26); jpyInfo.add(jtfInfo[3]); //电话号码 jtfInfo[4].setBounds(80,130,135,26); jpyInfo.add(jtfInfo[4]); //QQ jtfInfo[5].setBounds(80,160,135,26); jpyInfo.add(jtfInfo[5]); //Email jtfInfo[6].setBounds(80,190,135,26); jpyInfo.add(jtfInfo[6]); //地址文本框的添加 jtfInfo[7].setBounds(80,220,285,26); jpyInfo.add(jtfInfo[7]); //模糊查询信息文本区的添加 js.setBounds(0,350,600,100); jpyInfo.add(js); //编辑、保存按钮 jbInfo[0].setBounds(160,300,80,26); jbInfo[0].addActionListener(this); jpyInfo.add(jbInfo[0]); jbInfo[1].setBounds(260,300,80,26); jbInfo[1].addActionListener(this); jpyInfo.add(jbInfo[1]); //性别部分 jrbMale.setBounds(5,3,50,26); jrbMale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbMale); jpGender.add(jrbMale); jrbFemale.setBounds(60,3,50,26); jrbFemale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbFemale); jpGender.add(jrbFemale); jpGender.setBounds(60,70,125,26); jpyInfo.add(jpGender); } public void clearInfo()//清空信息面板 { for(int i=0;i<10;i++) { jtfInfo[i].setText("");//清空文本框 } jlPhoto.setIcon(null);//清空图像 } public void setjtaArea(String information){ if(information.isEmpty()){ JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { jta.setText(information); } } public void setInfo(Vector<String> pInfo)//将信息向量设置到信息面板中 {//将信息向量按规则填到信息面板里 this.clearInfo(); if(pInfo.size()==0) { JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { for(int i=0;i<2;i++) {//显示联系人编号和姓名 jtfInfo[i].setText(pInfo.get(i)); } if(pInfo.get(2).equals("男")) {//显示性别 jrbMale.setSelected(true); } else {//显示性别 jrbFemale.setSelected(true); } for(int i=3;i<9;i++) {//显示出生日期、电话号码和QQ jtfInfo[i].setText(pInfo.get(i)); } } } public Vector<String> getInfo()//从信息面板得到用户输入的信息 { Vector<String> pInfo=new Vector<String>(); pInfo.add(jtfInfo[0].getText().trim());//添加pid pInfo.add(jtfInfo[1].getText().trim());//添加pname String gender=jrbMale.isSelected()?"男":"女"; pInfo.add(gender);//添加性别 pInfo.add(jtfInfo[3].getText().trim());//出生日期 pInfo.add(jtfInfo[4].getText().trim());//电话号码 pInfo.add(jtfInfo[5].getText().trim());//QQ pInfo.add(jtfInfo[6].getText().trim());//Email pInfo.add(jtfInfo[7].getText().trim());//地址 String photoPath=jtfPhoto.getText().trim();//得到照片路径 pInfo.add(photoPath);//照片路径 return pInfo; } public void monitorSaveButton() //监听保存按钮的方法 { String sql=""; String pid=jtfInfo[0].getText().trim();//得到联系人的编号 String pname=jtfInfo[1].getText().trim();//得到联系人的姓名 String gender=jrbMale.isSelected()?"男":"女"; String s1=jtfInfo[3].getText().trim(); String s2=jtfInfo[4].getText().trim(); String s3=jtfInfo[5].getText().trim(); String s4=jtfInfo[6].getText().trim(); String s5=jtfInfo[7].getText().trim(); String s6=jtfPhoto.getText().trim(); String sqla="select * from contacts where pid='"+pid+"'";//判断此编号是否存在的SQL String sqlb="select * from contacts where pname='"+pname+"'";//判断此姓名是否存在的SQL boolean isIdExist=DButil.isExist(sqla);//得到编号是否存在 boolean isNameExist=DButil.isExist(sqlb);//得到姓名是否存在 if(!(pid.equals(" ")||pname.equals(" "))) { if(isIdExist||isNameExist){ JOptionPane.showMessageDialog(this,"联系人已存在"+ " , 添加联系人失败","错误",JOptionPane.WARNING_MESSAGE); } else { sql="insert into contacts values (?,?,?,?,?,?,?,?,?,?)"; String[] paras={pid,pname,gender,s1,s2,s3,s4,s5,s6,null}; if(DButil.update(sql,paras)>0){ JOptionPane.showMessageDialog(this,"联系人保存成功","提示", JOptionPane.INFORMATION_MESSAGE); } } } } public void setEditable(boolean Editable)//设置信息窗口是否可编辑 { jrbFemale.setEnabled(Editable);//设置性别是否可编辑 jrbMale.setEnabled(Editable);//设置性别是否可编辑 for(int i=0;i<8;i++) { jtfInfo[i].setEditable(Editable);//设置文本框是否可编辑 } } public void monitorSearchButton()//监听查找按钮的方法 { String name=jtfs.getText().trim(); String sql="";//声明查找字符串 if(name.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else { if(jrbxm.isSelected()==true) {//按姓名查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pname='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } else {//按编号查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pid='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } } this.setEditable(false);//设置面板不可编辑 } public void monitorRandomSearchButton(String information){ //监听模糊查询按钮 String adress=jba.getText().trim(); String sql="";//声明查找字符串 if(adress.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else{ sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where padress like '%天河区%'"; } } public MainFrame(String uname) { //主窗体构造器 this.uname=uname;//设置用户名 this.initJps();//界面上半部分的搭建 this.initInfo(); jspOuter.setDividerLocation(46);//设置分割窗体JSplitPane的位置 jspOuter.setTopComponent(topjp);//设置窗体上半部分的控件 jspOuter.setBottomComponent(jpyInfo);//设置下半部分的控件 //设置窗体关闭按钮执行的动作 this.add(jspOuter); this.addWindowListener( new WindowAdapter() { @SuppressWarnings("deprecation") public void WindowClosing(WindowEvent e) { //将窗体隐藏 MainFrame.this.hide(); } } ); //设置主窗体的图标、标题、大小以及可见性 this.setResizable(false);//设置窗体不让调整大小 this.setTitle(uname+"的通讯录"); this.setBounds(420,80,618,550); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jbInfo[1]) {//保存按钮的监听 this.monitorSaveButton(); } else if(e.getSource()==jba) {//模糊查询按钮的监听 DButil db = new DButil(); Vector vector1 = new Vector(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); String ad = jtfs.getText().trim(); tableModel.setDataVector(db.getData(ad),vector1); } else if(e.getSource()==jbInfo[2]) {//打开图像文件路径 jfcPic.showOpenDialog(this); if(jfcPic.getSelectedFile()!=null) { jtfPhoto.setText(""+jfcPic.getSelectedFile()); } } else if(e.getSource()==jbInfo[0]) {//编辑按钮的监听 this.setEditable(true);//设置信息面板可编辑 } else if(e.getSource()==jbs||e.getSource()==jtfs) {//查找,按按钮或者在文本框里敲回车 this.monitorSearchButton(); } } public void itemStateChanged(ItemEvent e) { } public static void main(String[] args){ } } package db; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DButil { private static String jdbcName="org.gjt.mm.mysql.Driver";//声明驱动类字符串 //声明数据库连接字符串 private static String dbUrl="jdbc:mysql://127.0.0.1:3306/maillist"; private static String dbUserName="root"; private static String dbPassword="admin"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement pstmt=null; private static ResultSet rs=null;//声明结果集对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 public static Connection getConnection()//得到数据库连接的方法 { System.out.println("连接中.."); try { Class.forName(jdbcName);//加载驱动类 con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//得到连接 System.out.println("成功连接"); } catch(Exception e){e.printStackTrace();} return con;//返回连接 } public static boolean check(String user,String pwd)//登陆验证 { boolean flag=false; try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery("select pwd from user where uid='"+user+"'"); rs.next(); String spwd=rs.getString(1);//得到密码 if(spwd.equals(pwd)) { flag=true;//密码匹配,登陆成功 } } catch(Exception e) { flag=false;//有任何异常发生,登陆失败 } finally{DButil.closeCon();}//关闭数据库连接 return flag; } //某条记录是否存在 public static boolean isExist(String sql) { boolean flag=false;//设置返回值 try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 if(rs.next()) { flag=true;//存在,设置返回值为true } } catch(Exception e) { e.printStackTrace(); flag=false;//发生任何异常,置返回结果为false } finally{DButil.closeCon();}//关闭数据库连接 return flag;//返回结果 } public static int update(String sql,String[] paras)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); pstmt=con.prepareStatement(sql); for(int i=0; i<paras.length;i++){ pstmt.setString(i+1, paras[i]); } count=pstmt.executeUpdate(); } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } public static int update(String sql)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); stat=con.createStatement(); count=stat.executeUpdate(sql);//执行更新 } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } //====================添加联系人================================= public static String insertPerson(String uid,Vector<String> pInfo) { String isPathNull="isNotNull";//传过来的图像是不是合法,默认不为空 try{ con=getConnection();//得到数据库连接 if(pInfo.get(8).equals("")||pInfo.get(8)==null) {//照片路径为空,则不插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,uid)"+ "values(?,?,?,?,?,?,?,?,?)"); } else {//照片路径不为空,则插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,pphoto,uid)"+ "values(?,?,?,?,?,?,?,?,?,?,?)" ); File f=new File(pInfo.get(8));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(11,b);//设置pphoto参数的数据 } for(int i=0;i<8;i++) {//设置公共信息 psInsert.setString(i+1,pInfo.get(i)); } psInsert.setString(10,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//图片路径不对 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭数据库连接 return isPathNull; } public static String updatePerson(String uid,Vector<String> pInfo){ String isPathNull="isNotNull";//传过来的path是不是合法 try{ con=getConnection(); if(pInfo.get(9).equals("")||pInfo.get(9)==null) {//更新时候,如果照片路径为空,则不更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,birthday=?,pnumber=?,"+ "pQQ=?,pemail=?,padress=?,pphoto=?,uid=? where pid='"+pInfo.get(0).trim()+"'"); } else {//如果照片路径不为空,则更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,page=?,pnumber=?,"+ "pemail=?,pgroup=?,ppostalcode=?,padress=?,uid=?,pphoto=? where pid='"+pInfo.get(0).trim()+"'"); File f=new File(pInfo.get(9));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(10,b); } for(int i=1;i<8;i++){//设置公共的信息部分 psInsert.setString(i,pInfo.get(i)); } psInsert.setString(9,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//路径不合法 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭连接 return isPathNull; } public Vector getData(String ad){ Vector vector=new Vector(); try { //陈述对象 con=getConnection();//得到数据库连接 stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);//创建语句对象 rs=stat.executeQuery("select * from contacts where padress LIKE '%"+ad+"%'"); ResultSetMetaData rm=rs.getMetaData(); //循环打印出数据库表中数据 int n=rm.getColumnCount(); while(rs.next()){ Vector ve=new Vector(); for(int i=1;i<n+1;i++){ String s=rs.getString(i); ve.add(s); } vector.add(ve);//Vector对象接收表中数据 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{if(rs!=null){ try { rs.close();//关闭结果集 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close();//关闭陈述对象 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close();//关闭连接 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return vector; } public static Vector<String> getPerInfo(String sql)//得到联系人信息 { Vector<String> pInfo=new Vector<String>(); try { con=getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 while(rs.next()) { for(int i=1;i<10;i++) { System.out.println(rs.getString(i)); pInfo.add(rs.getString(i));//将联系人信息添加到返回向量 } } } catch(Exception e) { e.printStackTrace(); } finally{DButil.closeCon();}//关闭数据库连接 return pInfo;//返回信息集合 } public static void closeCon()//关闭数据库连接的方法 { try { if(rs!=null){rs.close(); rs=null;}//如果结果集不为空关闭结果集并赋值null if(stat!=null){stat.close(); stat=null;}//如果语句对象不为空关闭语句对象并赋值null if(con!=null){con.close(); con=null;}//如果连接不为空关闭连接并赋值null } catch(Exception e){e.printStackTrace();} } public static void main(String[] args){ DButil DB=new DButil(); System.out.println(DB.getConnection()); } } }
c++,epoll,线程池,求解
主要问题: 客户端 与服务器端进行通信(传送一个字符串)当服务器端检测到epollin事件到来时,创建一个任务,加入到任务队列,相应的线程去处理任务。问题来了,为什么我的客户端与服务器只进行一次字符串的传送,服务器端会添加多个任务(300左右个)正常的话,应该是一个任务,所有的线程去抢这个任务,谁拿到任务了谁去执行,然后剩下的线程进行休眠。。。。。本人学生, 才接触这一块,希望大家帮帮忙。。。。 ``` 客户端 # include <iostream> # include <algorithm> # include <stdio.h> # include <string> # include <cstring> # include <cstdlib> # include <unistd.h> # include <sys/types.h> # include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> using namespace std ; # define ERR_EXIT(err) \ do \ { \ perror(err) ; \ exit(EXIT_FAILURE) ; \ \ }while(0) \ int main () { int res = 0 ; char buf[1024] ; memset(buf, 0, sizeof(buf)) ; int sockfd = socket(PF_INET, SOCK_STREAM, 0) ; if(sockfd < 0) ERR_EXIT("socket err") ; struct sockaddr_in cltaddr ; memset(&cltaddr, 0, sizeof(cltaddr)) ; cltaddr.sin_family = AF_INET ; cltaddr.sin_port = htons(8001) ; cltaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ;; res = connect(sockfd, (struct sockaddr *)&cltaddr, sizeof(cltaddr)) ; if(res < 0) ERR_EXIT("connect err") ; cin >> buf ; cout << buf << endl ; while(strcmp("exit", buf) != 0) { write(sockfd, buf, sizeof(buf)) ; memset(buf, '\0', sizeof(buf)) ; cin >> buf ; } close(sockfd) ; return 0 ; } ``` ``` 线程池 #ifndef _CTHREADPOLL_H_ #define _CTHREADPOLL_H_ # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; class CTask { public: CTask(){} ; // 无参构造函数 CTask(string taskName) // 有参构造函数 { this->m_strTaskName = taskName ; this->m_ptrData = NULL ; } public: virtual int PerformTask() = 0 ; // 执行任务的接口 void SetData(void *data) // 设置数据 { this->m_ptrData = data ; } protected: void *m_ptrData ; string m_strTaskName ; } ; class CThreadPoll { public: CThreadPoll(int threadNum = 10) ; // 有默认值的构造函数 public: int AddTack(CTask *task) ; // 添加任务到任务队列中 int getTaskSize() ; // 获取当前任务队列的数量 int StopAll() ; // 使线程池中的线程退出 protected: int CreatepThread() ; // 创建线程池中的线程 static void *ThreadCallBack (void * arg) ; // 线程回调函数 private: pthread_t *m_Thread_id ; // 线程id int m_iThreadNum ; // 线程池中的线程数量 static bool shutdown ; // 线程退出标志 static pthread_mutex_t m_pthreadMutex ; // poxsi线程锁 static pthread_cond_t m_pthreadCond ; // 条件等待变量 static vector<CTask *> m_vecTaskList ; // 任务列表 } ; #endif # include "CThreadpool.h" /************************************************************************/ bool CThreadPoll::shutdown = false ; // 线程退出标志 vector<CTask *> CThreadPoll::m_vecTaskList ; // 任务列表 pthread_mutex_t CThreadPoll::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER ; // poxsi线程锁 pthread_cond_t CThreadPoll::m_pthreadCond = PTHREAD_COND_INITIALIZER ; // 条件等待变量 int CThreadPoll::CreatepThread() { m_Thread_id = new pthread_t[m_iThreadNum] ; for(int i = 0; i < m_iThreadNum; i ++) { pthread_create(&m_Thread_id[i], NULL, ThreadCallBack, NULL); } return 0 ; } CThreadPoll::CThreadPoll(int threadNum) // 有默认值的构造函数 { this->m_iThreadNum = (pthread_t)threadNum ; CreatepThread() ; } void *CThreadPoll::ThreadCallBack (void *arg) { pthread_t tid = pthread_self() ; while(1) { pthread_mutex_lock(&m_pthreadMutex) ; cout << "tid is : " << tid << endl ; cout << "size is :" << m_vecTaskList.size() << endl ; while(m_vecTaskList.size() == 0 && !shutdown) { pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; } cout << "tid is1111 : " << tid << endl ; cout << "size is11111 :" << m_vecTaskList.size() << endl ; if(shutdown) { pthread_mutex_unlock(&m_pthreadMutex) ; pthread_exit(NULL) ; } vector<CTask *>::iterator iter = m_vecTaskList.begin() ; CTask *temp = NULL ; if(iter != m_vecTaskList.end()) { temp = *iter ; cout << "delete ..." << endl ; m_vecTaskList.erase(iter) ; } temp->PerformTask() ; pthread_mutex_unlock(&m_pthreadMutex) ; // sleep(2) ; } return NULL ; } int CThreadPoll::AddTack(CTask *task) { pthread_mutex_lock(&m_pthreadMutex) ; this->m_vecTaskList.push_back(task) ; pthread_mutex_unlock(&m_pthreadMutex) ; pthread_cond_signal(&m_pthreadCond) ; // pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; return 0 ; } int CThreadPoll::getTaskSize() { return this->m_vecTaskList.size() ; } int CThreadPoll::StopAll() { if(shutdown) { return -1 ; } // 把退出标记设置为true,唤醒所有等待的线程让它们退出 shutdown = true ; pthread_cond_broadcast(&m_pthreadCond) ; // 等待所有线程退出, 不然就成了僵尸线程了 for(int i = 0; i < m_iThreadNum; i ++) { pthread_join(m_Thread_id[i], NULL) ; } //释放掉tid所占用的内存空间 delete [] m_Thread_id ; //销毁互斥锁,和条件变量 pthread_cond_destroy(&m_pthreadCond) ; pthread_mutex_destroy(&m_pthreadMutex) ; return 0 ; } ``` ``` 测试 # include "CThreadpool.cpp" # include "mysqlbak.cpp" # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; typedef vector<struct epoll_event> EventList ; /*typedef struct _Packet { int len ; char buffsize[1024] ; } PACKET ;*/ struct INFO { int uid ; char name[20] ; char sex[10] ; unsigned int age ; unsigned int score ; } ; class WPTask : public CTask { public: WPTask(){} ; public: int PerformTask() { int ret = 0 ; char str[1024] ; struct INFO person ; int connfd = this->m_Connfd ; ret = read(connfd, str, sizeof(str)) ; if(ret == 0) { cout << "client close." << endl ; epoll_ctl(epollfd, EPOLL_CTL_DEL, connfd, &event) ; return -1 ; } cout << str << endl ; // cout << person.uid << " " << person.name << " " << person.sex << // " " << person.age << " " << person.score << endl ; /* ret = query_db(this->m_Mysql) ; if(ret == 0) { cout << "query err:" << endl ; } */ return 0 ; } void SetConnectFd(int connfd) { this->m_Connfd = connfd ; } void SetDatabaseFd(MYSQL mysql) { this->m_Mysql = mysql ; } protected: MYSQL m_Mysql ; int m_Connfd ; public: int epollfd ; struct epoll_event event ; } ; int main () { MYSQL mysql ; int res = login_db(mysql) ; if(res == -1) cout << "login_db err" << endl ; signal(SIGPIPE, SIG_IGN) ; signal(SIGCHLD, SIG_IGN) ; struct sockaddr_in srvaddr ; memset(&srvaddr, 0, sizeof(srvaddr)) ; srvaddr.sin_port = ntohs(8001) ; srvaddr.sin_family = AF_INET ; srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ; int idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; int listenfd = socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_TCP) ; if(listenfd == -1) cout << "socket failure." << endl ; int on = 1 ; if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) cout << "setsockopt failure." << endl ; if(bind(listenfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)) == -1) cout << "bind failure." << endl ; if(listen(listenfd, SOMAXCONN) == -1) cout << "listen failure." << endl ; CThreadPoll pthread(10) ; int nready, connfd ; int nontimeout = -1 ; EventList events(16) ; struct epoll_event event ; event.events = EPOLLIN ; event.data.fd = listenfd ; int epollfd = epoll_create1(EPOLL_CLOEXEC) ; epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event) ; struct sockaddr_in peeraddr ; socklen_t peerlen = sizeof(peerlen) ; while(1) { nready = epoll_wait(epollfd, &*events.begin(), static_cast<int>(events.size()), -1) ; if(nready == -1) { if(errno == EINTR) { continue ; } return -1 ; } if(nready == 0) { continue ; } if((size_t)nready == events.size()) { events.resize(events.size() * 2) ; } for(int i = 0; i < nready; i ++) { if(events[i].data.fd == listenfd) { if((connfd = accept4(listenfd, (struct sockaddr *)&peeraddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC)) == -1) { if(errno == EMFILE) { close(idlefd) ; idlefd = accept(listenfd, NULL, NULL) ; close(idlefd) ; idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; continue ; } return -1 ; } cout << "ip:" << inet_ntoa(peeraddr.sin_addr) << endl ; cout << "port:" << ntohl(peeraddr.sin_port) << endl ; event.events = EPOLLIN ; event.data.fd = connfd ; epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event) ; } else if(events[i].events & EPOLLIN) { connfd = events[i].data.fd ; if(connfd == 0) continue ; WPTask *task = new WPTask ; task->epollfd = epollfd ; task->event = events[i] ; task->SetDatabaseFd(mysql) ; task->SetConnectFd(connfd) ; cout << "renwu1" << endl ; // sleep(3) ; pthread.AddTack(task) ; } } } return 0 ; } ``` ![图片说明](https://img-ask.csdn.net/upload/201612/14/1481718038_751898.png) 附上图片: 此图片为客户端与服务器进行一次通信,服务器端建立了N个任务。。。。无语了。。。 如有能很好解决的人 麻烦您有时间的时候加下我的qq:712102032,本人不总玩csdn如能解决,必有重谢。 改成ET貌似可以了,但是。。。我的本意是LT, ET与LT的区别在哪里呢?
自己写了一个C++简单模型,有一些问题,请大神看看哪里导致我的程序总是有多个任务。
# include "CThreadpool.cpp" # include "mysqlbak.cpp" # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; typedef vector<struct epoll_event> EventList ; /*typedef struct _Packet { int len ; char buffsize[1024] ; } PACKET ;*/ struct INFO { int uid ; char name[20] ; char sex[10] ; unsigned int age ; unsigned int score ; } ; class WPTask : public CTask { public: WPTask(){} ; public: int PerformTask() { cout << "hello......" << endl ; int ret = 0 ; struct INFO person ; memset(&person, 0, sizeof(struct INFO)) ; int connfd = this->m_Connfd ; ret = read(connfd, &person, sizeof(struct INFO)) ; if(ret == 0) { cout << "client close." << endl ; epoll_ctl(epollfd, EPOLL_CTL_DEL, connfd, &event) ; return -1 ; } cout << person.uid << " " << person.name << " " << person.sex << " " << person.age << " " << person.score << endl ; /* ret = query_db(this->m_Mysql) ; if(ret == 0) { cout << "query err:" << endl ; } */ return 0 ; } void SetConnectFd(int connfd) { this->m_Connfd = connfd ; } void SetDatabaseFd(MYSQL mysql) { this->m_Mysql = mysql ; } protected: MYSQL m_Mysql ; int m_Connfd ; public: int epollfd ; struct epoll_event event ; } ; int main () { MYSQL mysql ; int res = login_db(mysql) ; if(res == -1) cout << "login_db err" << endl ; signal(SIGPIPE, SIG_IGN) ; signal(SIGCHLD, SIG_IGN) ; struct sockaddr_in srvaddr ; memset(&srvaddr, 0, sizeof(srvaddr)) ; srvaddr.sin_port = ntohs(8001) ; srvaddr.sin_family = AF_INET ; srvaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ; int idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; int listenfd = socket(PF_INET, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, IPPROTO_TCP) ; if(listenfd == -1) cout << "socket failure." << endl ; int on = 1 ; if(setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) cout << "setsockopt failure." << endl ; if(bind(listenfd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)) == -1) cout << "bind failure." << endl ; if(listen(listenfd, SOMAXCONN) == -1) cout << "listen failure." << endl ; CThreadPoll pthread(10) ; int nready, connfd ; int nontimeout = -1 ; EventList events(16) ; struct epoll_event event ; event.events = EPOLLIN ; event.data.fd = listenfd ; int epollfd = epoll_create1(EPOLL_CLOEXEC) ; epoll_ctl(epollfd, EPOLL_CTL_ADD, listenfd, &event) ; struct sockaddr_in peeraddr ; socklen_t peerlen = sizeof(peerlen) ; while(1) { nready = epoll_wait(epollfd, &*events.begin(), static_cast<int>(events.size()), -1) ; if(nready == -1) { if(errno == EINTR) { continue ; } return -1 ; } if(nready == 0) { continue ; } if((size_t)nready == events.size()) { events.resize(events.size() * 2) ; } for(int i = 0; i < nready; i ++) { if(events[i].data.fd == listenfd) { if((connfd = accept4(listenfd, (struct sockaddr *)&peeraddr, &peerlen, SOCK_NONBLOCK | SOCK_CLOEXEC)) == -1) { if(errno == EMFILE) { close(idlefd) ; idlefd = accept(listenfd, NULL, NULL) ; close(idlefd) ; idlefd = open("dev/null", O_RDONLY | O_CLOEXEC) ; continue ; } return -1 ; } cout << "ip:" << inet_ntoa(peeraddr.sin_addr) << endl ; cout << "port:" << ntohl(peeraddr.sin_port) << endl ; event.events = EPOLLIN ; event.data.fd = connfd ; epoll_ctl(epollfd, EPOLL_CTL_ADD, connfd, &event) ; } else if(events[i].events & EPOLLIN) { connfd = events[i].data.fd ; if(connfd == 0) continue ; WPTask *task = new WPTask ; task->epollfd = epollfd ; task->event = events[i] ; task->SetDatabaseFd(mysql) ; task->SetConnectFd(connfd) ; cout << "renwu1" << endl ; // sleep(3) ; pthread.AddTack(task) ; } } } return 0 ; } ``` ``` #ifndef _CTHREADPOLL_H_ #define _CTHREADPOLL_H_ # include <unistd.h> # include <stdlib.h> # include <fcntl.h> # include <arpa/inet.h> # include <sys/stat.h> # include <signal.h> # include <sys/types.h> # include <iostream> # include <sys/socket.h> # include <sys/socket.h> # include <iomanip> # include <string.h> # include <string> # include <errno.h> # include <vector> # include <sys/wait.h> # include <pthread.h> # include <sys/epoll.h> # include <algorithm> using namespace std ; class CTask { public: CTask(){} ; // 无参构造函数 CTask(string taskName) // 有参构造函数 { this->m_strTaskName = taskName ; this->m_ptrData = NULL ; } public: virtual int PerformTask() = 0 ; // 执行任务的接口 void SetData(void *data) // 设置数据 { this->m_ptrData = data ; } protected: void *m_ptrData ; string m_strTaskName ; } ; class CThreadPoll { public: CThreadPoll(int threadNum = 10) ; // 有默认值的构造函数 public: int AddTack(CTask *task) ; // 添加任务到任务队列中 int getTaskSize() ; // 获取当前任务队列的数量 int StopAll() ; // 使线程池中的线程退出 protected: int CreatepThread() ; // 创建线程池中的线程 static void *ThreadCallBack (void * arg) ; // 线程回调函数 private: pthread_t *m_Thread_id ; // 线程id int m_iThreadNum ; // 线程池中的线程数量 static bool shutdown ; // 线程退出标志 static pthread_mutex_t m_pthreadMutex ; // poxsi线程锁 static pthread_cond_t m_pthreadCond ; // 条件等待变量 static vector<CTask *> m_vecTaskList ; // 任务列表 } ; #endif # include "CThreadpool.h" /************************************************************************/ bool CThreadPoll::shutdown = false ; // 线程退出标志 vector<CTask *> CThreadPoll::m_vecTaskList ; // 任务列表 pthread_mutex_t CThreadPoll::m_pthreadMutex = PTHREAD_MUTEX_INITIALIZER ; // poxsi线程锁 pthread_cond_t CThreadPoll::m_pthreadCond = PTHREAD_COND_INITIALIZER ; // 条件等待变量 int CThreadPoll::CreatepThread() { m_Thread_id = new pthread_t[m_iThreadNum] ; for(int i = 0; i < m_iThreadNum; i ++) { pthread_create(&m_Thread_id[i], NULL, ThreadCallBack, NULL); } return 0 ; } CThreadPoll::CThreadPoll(int threadNum) // 有默认值的构造函数 { this->m_iThreadNum = (pthread_t)threadNum ; CreatepThread() ; } void *CThreadPoll::ThreadCallBack (void * arg) { pthread_t tid = pthread_self() ; while(1) { pthread_mutex_lock(&m_pthreadMutex) ; cout << "tid is : " << tid << endl ; cout << "size is :" << m_vecTaskList.size() << endl ; while(m_vecTaskList.size() == 0 && !shutdown) { pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; } if(shutdown) { pthread_mutex_unlock(&m_pthreadMutex) ; pthread_exit(NULL) ; } vector<CTask *>::iterator iter = m_vecTaskList.begin() ; CTask *temp = NULL ; if(iter != m_vecTaskList.end()) { temp = *iter ; cout << "delete ..." << endl ; m_vecTaskList.erase(iter) ; } pthread_mutex_unlock(&m_pthreadMutex) ; temp->PerformTask() ; // sleep(2) ; } return NULL ; } int CThreadPoll::AddTack(CTask *task) { pthread_mutex_lock(&m_pthreadMutex) ; this->m_vecTaskList.push_back(task) ; pthread_mutex_unlock(&m_pthreadMutex) ; pthread_cond_signal(&m_pthreadCond) ; // pthread_cond_wait(&m_pthreadCond, &m_pthreadMutex) ; return 0 ; } int CThreadPoll::getTaskSize() { return this->m_vecTaskList.size() ; } int CThreadPoll::StopAll() { if(shutdown) { return -1 ; } // 把退出标记设置为true,唤醒所有等待的线程让它们退出 shutdown = true ; pthread_cond_broadcast(&m_pthreadCond) ; // 等待所有线程退出, 不然就成了僵尸线程了 for(int i = 0; i < m_iThreadNum; i ++) { pthread_join(m_Thread_id[i], NULL) ; } //释放掉tid所占用的内存空间 delete [] m_Thread_id ; //销毁互斥锁,和条件变量 pthread_cond_destroy(&m_pthreadCond) ; pthread_mutex_destroy(&m_pthreadMutex) ; return 0 ; } 客户端。。。。。。。。。。。。。。。。。。。。。。。。。 int main () { int ret = 0 ; int sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) ; if(sockfd < 0) { cout << "sockfd failure." << endl ; } struct sockaddr_in cltaddr ; memset(&cltaddr, 0, sizeof(cltaddr)) ; cltaddr.sin_family = AF_INET ; cltaddr.sin_port = htons(8001) ; cltaddr.sin_addr.s_addr = inet_addr("127.0.0.1") ; char p[100] = "hello server.\n" ; if(connect(sockfd, (struct sockaddr *)&cltaddr, sizeof(cltaddr)) < 0) { cout << "connect failure." << endl ; } int a = 1 ; while(a --) { write(sockfd, p, sizeof(p)) ; } close(sockfd) ; return 0 ; } 多次出发EPOLLIN事件。。。。真的很是无语, 小白,求解,
spring3.1+ehcache配置问题
ehcache主配置如下: <!-- 配置ehcache缓存管理器 --> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache/ehcache.xml" /> <property name="shared" value="true"/> </bean> <!-- 配置一个简单的缓存工厂bean对象 --> <bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <!-- 使用缓存 关联ehcache.xml中的缓存配置 --> <property name="cacheName" value="mobileCache" /> </bean> <!-- 配置一个缓存拦截器对象,处理具体的缓存业务 --> <bean id="methodCacheInterceptor" class="com.scxxs.ehcache.MethodCacheInterceptor"> <property name="cache" ref="simpleCache"/> </bean> <!-- 配置一个缓存拦截器对象,处理具体的缓存业务 --> <bean id="methodCacheAfterAdvice" class="com.scxxs.ehcache.MethodCacheAfterAdvice"> <property name="cache" ref="simpleCache"/> </bean> <!-- 参与缓存的切入点对象 (切入点对象,确定何时何地调用拦截器) --> <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <!-- 配置缓存aop切面 --> <property name="advice" ref="methodCacheInterceptor" /> <!-- 配置哪些方法参与缓存策略 --> <!-- .表示符合任何单一字元 ### +表示符合前一个字元一次或多次 ### *表示符合前一个字元零次或多次 ### \Escape任何Regular expression使用到的符号 --> <!-- .*表示前面的前缀(包括包名) 表示print方法--> <property name="patterns"> <list> <!-- <value>com.scxxs.dao.*get*</value> <value>com.scxxs.dao.*find*</value> <value>com.scxxs.dao.*query*</value> --> <value>.*find.*</value> </list> </property> </bean> <!-- 当发生create,save,insert,update,delete,remove等方法时,就会去flush一下 --> <bean id="methodCachePointCutAdvice" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice" ref="methodCacheAfterAdvice" /> <property name="patterns"> <list> <value>.*add.*</value> </list> </property> </bean> ehcache.xml配置如下: <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <!-- 设置缓存文件 .data 的创建路径。 如果该路径是 Java 系统参数,当前虚拟机会重新赋值。 下面的参数这样解释: user.home – 用户主目录 user.dir – 用户当前工作目录 java.io.tmpdir – 默认临时文件路径 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/> <!-- 配置自定义缓存 maxElementsInMemory:缓存中允许创建的最大对象数 eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。 timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前, 两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效, 如果该值是 0 就意味着元素可以停顿无穷长的时间。 timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值, 这只能在元素不是永久驻留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。 overflowToDisk:内存不足时,是否启用磁盘缓存。 memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。 --> <cache name="SimplePageCachingFilter" maxElementsInMemory="10000" eternal="false" overflowToDisk="false" timeToIdleSeconds="900" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LFU" /> <cache name="mobileCache" maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="1800" timeToLiveSeconds="3600" memoryStoreEvictionPolicy="LFU" /> </ehcache> applicationContext.xml spring主配置如下: <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://127.0.0.1:3306/mytest</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>root</value> </property> </bean> <!-- 配置事务管理器 --> <bean id="transcationManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:ibatis/SqlMapConfig.xml" /> <!--src/ WEB-INF/<property name="mapperLocations" value="classpath*:com/xxt/ibatis/dbcp/domain/user.map.xml"/ > --> </bean> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="transcationManager"> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="del*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="*" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置AOP切入点 --> <aop:config> <aop:pointcut id="allManagerMethod" expression="execution(* com.scxxs.dao.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" /> </aop:config> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource"> <ref local="dataSource"/> </property> </bean> <import resource="spring/applicationContext_dao.xml"/> <import resource="spring/applicationContext_biz.xml"/> <import resource="spring/applicationContext_ehcache.xml"/> 我遇到的问题就是,ehcache在配置两个切面的时候报错: 2013-01-06 14:33:38Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1aaf64d: defining beans [dataSource,transcationManager,sqlSessionFactory,sqlSession,txAdvice,org.springframework.aop.config.internalAutoProxyCreator,allManagerMethod,org.springframework.aop.support.DefaultBeanFactoryPointcutAdvisor#0,jdbcTemplate,springDemoDao,userDao,userBiz,cacheManager,simpleCache,methodCacheInterceptor,methodCacheAfterAdvice,methodCachePointCut,methodCachePointCutAdvice]; root of factory hierarchy 2013-01-06 14:33:38Retrieved dependent beans for bean 'cacheManager': [simpleCache] 2013-01-06 14:33:38Retrieved dependent beans for bean 'simpleCache': [methodCacheAfterAdvice] 2013-01-06 14:33:38Retrieved dependent beans for bean 'methodCacheAfterAdvice': [methodCachePointCutAdvice] 2013-01-06 14:33:38Invoking destroy() on bean with name 'cacheManager' 2013-01-06 14:33:38Shutting down EHCache CacheManager 2013-01-06 14:33:38Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCachePointCut' defined in class path resource [spring/applicationContext_ehcache.xml]: Cannot resolve reference to bean 'methodCacheInterceptor' while setting bean property 'advice'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3827) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4334) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:566) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCachePointCut' defined in class path resource [spring/applicationContext_ehcache.xml]: Cannot resolve reference to bean 'methodCacheInterceptor' while setting bean property 'advice'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:86) at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:100) at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:107) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:880) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:852) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:446) ... 34 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) ... 50 more Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) ... 56 more Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241) at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470) ... 62 more 2013-1-6 14:33:38 org.apache.catalina.core.StandardContext listenerStart 严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [applicationContext.xml]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCachePointCut' defined in class path resource [spring/applicationContext_ehcache.xml]: Cannot resolve reference to bean 'methodCacheInterceptor' while setting bean property 'advice'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:452) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3827) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4334) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525) at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920) at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883) at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492) at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:566) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCachePointCut' defined in class path resource [spring/applicationContext_ehcache.xml]: Cannot resolve reference to bean 'methodCacheInterceptor' while setting bean property 'advice'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1360) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:86) at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:100) at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:107) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:278) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:880) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:852) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:446) ... 34 more Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'methodCacheInterceptor' defined in class path resource [spring/applicationContext_ehcache.xml]: Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) ... 50 more Caused by: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type '$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised' to required type 'net.sf.ehcache.Cache' for property 'cache'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516) at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) ... 56 more Caused by: java.lang.IllegalStateException: Cannot convert value of type [$Proxy4 implementing net.sf.ehcache.terracotta.InternalEhcache,net.sf.ehcache.store.StoreListener,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [net.sf.ehcache.Cache] for property 'cache': no matching editors or conversion strategy found at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:241) at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470) ... 62 more 我试过删除一个切面的话项目是能够完全启动的, <!-- 配置一个简单的缓存工厂bean对象 --> <bean id="simpleCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <!-- 使用缓存 关联ehcache.xml中的缓存配置 --> <property name="cacheName" value="mobileCache" /> </bean> <!-- 参与缓存的切入点对象 (切入点对象,确定何时何地调用拦截器) --> <bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <!-- 配置缓存aop切面 --> <property name="advice" ref="methodCacheInterceptor" /> <!-- 配置哪些方法参与缓存策略 --> <!-- .表示符合任何单一字元 ### +表示符合前一个字元一次或多次 ### *表示符合前一个字元零次或多次 ### \Escape任何Regular expression使用到的符号 --> <!-- .*表示前面的前缀(包括包名) 表示print方法--> <property name="patterns"> <list> <!-- <value>com.scxxs.dao.*get*</value> <value>com.scxxs.dao.*find*</value> <value>com.scxxs.dao.*query*</value> --> <value>.*find.*</value> </list> </property> </bean> 像上面这种配置有两个删除其中一个都没问题。我还测试过缓存起作用没,当我删除后面那个after切面后项目正常启动且缓存起作用,请教各位大虾为了我两个切面都存在的时候就要报错,报错信息就是上面那种,搞不懂啊!!!!
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Vue + Spring Boot 项目实战(十四):用户认证方案与完善的访问拦截
本篇文章主要讲解 token、session 等用户认证方案的区别并分析常见误区,以及如何通过前后端的配合实现完善的访问拦截,为下一步权限控制的实现打下基础。
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入  假设现有4个人
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
SQL-小白最佳入门sql查询一
一 说明 如果是初学者,建议去网上寻找安装Mysql的文章安装,以及使用navicat连接数据库,以后的示例基本是使用mysql数据库管理系统; 二 准备前提 需要建立一张学生表,列分别是id,名称,年龄,学生信息;本示例中文章篇幅原因SQL注释略; 建表语句: CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // dosho
漫话:什么是平衡(AVL)树?这应该是把AVL树讲的最好的文章了
这篇文章通过对话的形式,由浅入深带你读懂 AVL 树,看完让你保证理解 AVL 树的各种操作,如果觉得不错,别吝啬你的赞哦。 1、若它的左子树不为空,则左子树上所有的节点值都小于它的根节点值。 2、若它的右子树不为空,则右子树上所有的节点值均大于它的根节点值。 3、它的左右子树也分别可以充当为二叉查找树。 例如: 例如,我现在想要查找数值为14的节点。由于二叉查找树的特性,我们可...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
开源并不是你认为的那些事
点击上方蓝字 关注我们开源之道导读所以 ————想要理清开源是什么?先要厘清开源不是什么,名正言顺是句中国的古代成语,概念本身的理解非常之重要。大部分生物多样性的起源,...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下
《C++ Primer》学习笔记(六):C++模块设计——函数
专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 https://blog.csdn.net/TeFuirnever/article/details/100700212 —————————————————————————————————————————————————————— 《C++ Primer》习题参考答案:第6章 - C++模块设计——函数 文章目录专栏C+...
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法不过,当我看了源代码之后这程序不到50
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
MySQL数据库总结
文章目录一、数据库简介二、MySQL数据类型(5.5版本)三、Sql语句(1)Sql语句简介(2)数据定义语言DDLcreate,alter,drop(3)数据操纵语言DMLupdate,insert,delete(4)数据控制语言DCLgrant,revoke(5)数据查询语言DQLselect(6)分组查询与分页查询group by,limit四、完整性约束(单表)五、多表查询六、MySQL数
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
中年危机,35 岁定律,见鬼去吧!
中年危机,35 岁定律,相信你都听说过,每次触及还会让你感到丝丝焦虑,毕竟时间这把杀猪刀不会放过任何一个人。中年危机或 35 岁定律是客观存在的,你迟早都会遭遇的,那你是否有信心战胜它呢? 中年危机之所以让人害怕,一则是你没有把握打赢这场遭遇战,再则中年是一个输不起的阶段。古人云:知己知彼,百战不殆。恐惧,主要源自对敌人和自己的不了解,不知道敌人的优劣势,也不清楚自己的长短板,常常以己之所短攻彼...
程序设计的5个底层逻辑,决定你能走多快
阿里妹导读:肉眼看计算机是由CPU、内存、显示器这些硬件设备组成,但大部分人从事的是软件开发工作。计算机底层原理就是连通硬件和软件的桥梁,理解计算机底层原理才能在程序设计这条路上越走越快,越走越轻松。从操作系统层面去理解高级编程语言的执行过程,会发现好多软件设计都是同一种套路,很多语言特性都依赖于底层机制,今天董鹏为你一一揭秘。 结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺...
张小龙-年薪近3亿的微信之父,他是如何做到的?
张小龙生于湖南邵东魏家桥镇, 家庭主要特点:穷。 不仅自己穷,亲戚也都很穷,可以说穷以类聚。爷爷做过铜匠,总的来说,标准的劳动阶级出身。 家有兄弟两人, 一个小龙,一个小虎。 小虎好动,与邻里打成一片, 小龙好静,喜好读书。 “文静的像个妹子。”张小龙的表哥如是说。 穷文富武,做个读书郎是个不错的选择。 87年至94年, 华中科技大学本硕连读。 本科就读电信系, 不喜欢上课
阿里靠什么武功秘籍渡过“双十一“的天量冲击
双十一大概会产生多大的数据量呢,可能大家没概念,举个例子央视拍了这么多年电视新闻节目,几十年下来他存了大概80P的数据。而今年双11一天,阿里要处理970P的数据,做为一个IT人,笔者认为今年”双十一“阿里最大的技术看点有有以下两个: 阿里的数据库,也就是刚刚拿下TPC冠军的OcceanBase,处理峰值也达到了骇人听闻的6100万次/秒, 阿里核心系统百分百上云了。 如果把信息系统比做一个武
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
Zookeeper的基本命令大全
1、列出节点 ls path ls -s path //包含该节点的详细信息,如子节点总数等 2、查看节点状态 stat path cZxid = 0x14f //创建节点的ID ctime = Thu Nov 07 01:02:53 CST 2019 //节点的创建时间 mZxid = 0x14f //修改节点ID mtime = Thu Nov 07 01:02:53 CST 2019 ...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问