HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
如果當前分支是master,那么執(zhí)行git pull origin test:test不僅會合并test-->origin/test,還會合并當前分支master-->origin/test
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
第一次用git提交master,登錄了git的賬號密碼還是報這個錯誤 ,求大佬幫忙
fatal: AggregateException encountered. One or more errors occurred.
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
具體描述:
1. 多人協(xié)作一個項目
2. 我半年沒有改動過這個項目的代碼了, 沒有pull, 沒有push; 但是同事們還在開發(fā), 他們刪除了一些老分支, 新建了一些新分支, 改動了若干代碼. 我本地的代碼庫是半年前的老代碼.
3. 由于突發(fā)需求, 我改了代碼, 忘了pull直接commit, push了.
4. 結果導致線上的所有最新分支都丟失了, 被我本地的半年前的所有老分支替換了; 也就是說同事們這半年來的改動全丟失了, 線上和我本地倉庫都只有半年前的代碼加上我最近改動的代碼了....
5. 我試圖回滾版本, 發(fā)現(xiàn)無論線上還是我本地倉庫, 都找不到同事們最近半年的提交記錄, 只有半年前的和最近我的提交記錄, 所以我也沒能找回這半年同事們的代碼了, 所以真心求助各位高手們~~拜謝啦!!
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
比方說,我用android studi 建立一個工程,其目錄是TestProject
我在github上有自己的2個分支
https://github.com/test2468/huap.git (另一分支 huap)
https://github.com/test2468/project.git(主分支master)
我先在主分支下,使用
git add TestProject
git commit -m "add TestProject master"
git push https://github.com/test2468/project.git
上傳到遠程分支成功。而且,通過瀏覽器查看了下,發(fā)現(xiàn)其工程完整的上傳過來了。
然后我切換分支 git checkout huap
然后再用同樣的命令
git add TestProject
git commit -m "add TestProject huap"
git push https://github.com/test2468/huap.git
也上傳成功,可是,我通過瀏覽器查看,發(fā)現(xiàn)這個工程是不完整的,缺少很多文件,請問這是怎么回事啊?
我只是想驗證下
1,本地同一個工程,如何做到本地修改同一個文件,然后分別上傳到2個不同的遠程分支?
2,本地同一個工程,如何做到本地對同一個文件做不同的修改,然后分別上傳到2個不同的遠程分支?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
如上圖想要添加這其中三個文件,但是總是不行,應該如何操作?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
三款工具,這里用的最多是哪一個啊
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
這個還不能在 PyCharm上使用嗎?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
服務器centos7.2
hive版本0.12
hadoop版本2.7.6
----------------分割線-----------------
創(chuàng)建table的時候,用的外部表,放置于mysql,其中使用了partitioned by 關鍵字 ( partitioned by (logdate string,hour string)
)。
具體代碼片段為: create external table people(id int,name string) partitioned by (logdate string,hour string) row format delimited fields terminated by ',';
--------------------------------
但是??! 往表里面存入數(shù)據(jù)時就報錯為 hive.partition doesn't exists !!!! java.sql.SQLSyntaxErrorException: Table 'hive.PARTITIONS' doesn't exist
mysql那邊看了,hive數(shù)據(jù)庫生成了,但確實沒有partition表。只有下圖。
select * 之后確實是我添加的partition字段
可是沒辦法改這個表的名字為partition啊(似乎是因為mysql關鍵字存在partition)?。?
那我該如何存取數(shù)據(jù)進入這個hive表??
求幫助,謝謝。
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
軟件運行環(huán)境:redhat 6
hadoop-2.6.0-cdh5.9.0
hive-1.1.0-cdh5.9.0
sqoop-1.4.6-cdh5.9.0
hive在主節(jié)點,sqoop在從節(jié)點上
sqoop導入hive表示報錯 16/12/09 17:18:47 INFO mapreduce.ImportJobBase: Transferred 49 bytes in 19.624 seconds (2.4969 bytes/sec) 16/12/09 17:18:47 INFO mapreduce.ImportJobBase: Retrieved 6 records. 16/12/09 17:18:47 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM `sss` AS t LIMIT 1 16/12/09 17:18:47 INFO hive.HiveImport: Loading uploaded data into Hive 16/12/09 17:18:47 ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly. 16/12/09 17:18:47 ERROR tool.ImportTool: Encountered IOException running import job: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:50) at org.apache.sqoop.hive.HiveImport.getHiveArgs(HiveImport.java:392) at org.apache.sqoop.hive.HiveImport.executeExternalHiveScript(HiveImport.java:379) at org.apache.sqoop.hive.HiveImport.executeScript(HiveImport.java:337) at org.apache.sqoop.hive.HiveImport.importTable(HiveImport.java:241) at org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:524) at org.apache.sqoop.tool.ImportTool.run(ImportTool.java:615) at org.apache.sqoop.Sqoop.run(Sqoop.java:143) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218) at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227) at org.apache.sqoop.Sqoop.main(Sqoop.java:236) Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:190) at org.apache.sqoop.hive.HiveConfig.getHiveConf(HiveConfig.java:44) ... 12 more
我的hive能正常啟動,
網(wǎng)上說的環(huán)境變量的問題也配置了,還有什么問題可以去檢查 export HIVE_HOME=/home/hadoop/hive-1.1.0-cdh5.9.0 export HADOOP_HOME=/home/hadoop/hadoop-2.6.0-cdh5.9.0 export HIVE_CONF_DIR=/home/hadoop/hive-1.1.0-cdh5.9.0/conf export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 2015-08-26 16:48:55,941 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - Changing view acls to: root2015-08-26 16:48:55,946 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - Changing modify acls to: root 2015-08-26 16:48:55,947 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root) 2015-08-26 16:48:56,403 INFO [sparkDriver-akka.actor.default-dispatcher-4] slf4j.Slf4jLogger (Slf4jLogger.scala:applyOrElse(80)) - Slf4jLogger started 2015-08-26 16:48:56,456 INFO [sparkDriver-akka.actor.default-dispatcher-4] Remoting (Slf4jLogger.scala:apply$mcV$sp(74)) - Starting remoting 2015-08-26 16:48:56,816 INFO [sparkDriver-akka.actor.default-dispatcher-5] Remoting (Slf4jLogger.scala:apply$mcV$sp(74)) - Remoting started; listening on addresses :[akka.tcp://sparkDriver@hadoop05:54033] 2015-08-26 16:48:56,820 INFO [sparkDriver-akka.actor.default-dispatcher-5] Remoting (Slf4jLogger.scala:apply$mcV$sp(74)) - Remoting now listens on addresses: [akka.tcp://sparkDriver@hadoop05:54033] 2015-08-26 16:48:56,832 INFO [main] util.Utils (Logging.scala:logInfo(59)) - Successfully started service 'sparkDriver' on port 54033. 2015-08-26 16:48:56,857 INFO [main] spark.SparkEnv (Logging.scala:logInfo(59)) - Registering MapOutputTracker 2015-08-26 16:48:56,870 INFO [main] spark.SparkEnv (Logging.scala:logInfo(59)) - Registering BlockManagerMaster 2015-08-26 16:48:56,889 INFO [main] storage.DiskBlockManager (Logging.scala:logInfo(59)) - Created local directory at /tmp/spark-local-20150826164856-d539 2015-08-26 16:48:56,893 INFO [main] storage.MemoryStore (Logging.scala:logInfo(59)) - MemoryStore started with capacity 530.3 MB 2015-08-26 16:48:57,347 WARN [main] util.NativeCodeLoader (NativeCodeLoader.java:(62)) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 2015-08-26 16:48:57,538 INFO [main] spark.HttpFileServer (Logging.scala:logInfo(59)) - HTTP File server directory is /tmp/spark-8ea80eb5-5ae9-4f11-8c5f-4616d14fc3d3 2015-08-26 16:48:57,543 INFO [main] spark.HttpServer (Logging.scala:logInfo(59)) - Starting HTTP Server 2015-08-26 16:48:57,603 INFO [main] server.Server (Server.java:doStart(272)) - jetty-8.y.z-SNAPSHOT 2015-08-26 16:48:57,624 INFO [main] server.AbstractConnector (AbstractConnector.java:doStart(338)) - Started SocketConnector@0.0.0.0:50271 2015-08-26 16:48:57,624 INFO [main] util.Utils (Logging.scala:logInfo(59)) - Successfully started service 'HTTP file server' on port 50271. 2015-08-26 16:48:57,739 INFO [main] server.Server (Server.java:doStart(272)) - jetty-8.y.z-SNAPSHOT 2015-08-26 16:48:57,752 INFO [main] server.AbstractConnector (AbstractConnector.java:doStart(338)) - Started SelectChannelConnector@0.0.0.0:4040 2015-08-26 16:48:57,753 INFO [main] util.Utils (Logging.scala:logInfo(59)) - Successfully started service 'SparkUI' on port 4040. 2015-08-26 16:48:57,756 INFO [main] ui.SparkUI (Logging.scala:logInfo(59)) - Started SparkUI at http://hadoop05:4040 2015-08-26 16:48:57,885 INFO [main] spark.SparkContext (Logging.scala:logInfo(59)) - Added JAR /home/hbase/cdrp-0.0.2-SNAPSHOT.jar at http://10.2.98.144:50271/jars/cdrp-0.0.2-SNAPSHOT.jar with timestamp 1440578937884 2015-08-26 16:48:57,886 INFO [main] spark.SparkContext (Logging.scala:logInfo(59)) - Added JAR /home/hbase/oozie-client-4.0.0-cdh5.2.0.jar at http://10.2.98.144:50271/jars/oozie-client-4.0.0-cdh5.2.0.jar with timestamp 1440578937886 2015-08-26 16:48:58,052 INFO [main] client.RMProxy (RMProxy.java:createRMProxy(98)) - Connecting to ResourceManager at /0.0.0.0:8032 2015-08-26 16:48:58,283 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Requesting a new application from cluster with 7 NodeManagers 2015-08-26 16:48:58,298 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Verifying our application has not requested more than the maximum memory capability of the cluster (9990 MB per container) 2015-08-26 16:48:58,299 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Will allocate AM container, with 1408 MB memory including 384 MB overhead 2015-08-26 16:48:58,300 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Setting up container launch context for our AM 2015-08-26 16:48:58,305 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Preparing resources for our AM container 2015-08-26 16:48:58,442 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Source and destination file systems are the same. Not copying file:/opt/cloudera/parcels/CDH-5.3.5-1.cdh5.3.5.p0.4/jars/spark-assembly-1.2.0-cdh5.3.5-hadoop2.5.0-cdh5.3.5.jar 2015-08-26 16:48:58,526 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Setting up the launch environment for our AM container 2015-08-26 16:48:58,731 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - Changing view acls to: root 2015-08-26 16:48:58,732 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - Changing modify acls to: root 2015-08-26 16:48:58,732 INFO [main] spark.SecurityManager (Logging.scala:logInfo(59)) - SecurityManager: authentication disabled; ui acls disabled; users with view permissions: Set(root); users with modify permissions: Set(root) 2015-08-26 16:48:58,735 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Submitting application 42 to ResourceManager 2015-08-26 16:48:58,776 INFO [main] impl.YarnClientImpl (YarnClientImpl.java:submitApplication(236)) - Submitted application application_1440484199657_0042 2015-08-26 16:48:59,782 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:48:59,790 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - client token: N/A diagnostics: N/A ApplicationMaster host: N/A ApplicationMaster RPC port: -1 queue: root.root start time: 1440578938748 final status: UNDEFINED tracking URL: http://hadoop05:8088/proxy/application_1440484199657_0042/ user: root 2015-08-26 16:49:00,794 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:01,798 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:02,803 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:03,807 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:04,812 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:05,818 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:06,823 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:07,828 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:08,832 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:09,837 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:10,844 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:11,849 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: ACCEPTED) 2015-08-26 16:49:12,853 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - Application report for application_1440484199657_0042 (state: FAILED) 2015-08-26 16:49:12,855 INFO [main] yarn.Client (Logging.scala:logInfo(59)) - client token: N/A diagnostics: Application application_1440484199657_0042 failed 2 times due to AM Container for appattempt_1440484199657_0042_000002 exited with exitCode: 1 due to: Exception from container-launch. Container id: container_1440484199657_0042_02_000001 Exit code: 1 Stack trace: ExitCodeException exitCode=1: at org.apache.hadoop.util.Shell.runCommand(Shell.java:538) at org.apache.hadoop.util.Shell.run(Shell.java:455) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:702) at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:197) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:299) at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745) Container exited with a non-zero exit code 1 .Failing this attempt.. Failing the application. ApplicationMaster host: N/A ApplicationMaster RPC port: -1 queue: root.root start time: 1440578938748 final status: FAILED tracking URL: http://hadoop05:8088/cluster/app/application_1440484199657_0042 user: root Exception in thread "main" org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master. at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.waitForApplication(YarnClientSchedulerBackend.scala:102) at org.apache.spark.scheduler.cluster.YarnClientSchedulerBackend.start(YarnClientSchedulerBackend.scala:58) at org.apache.spark.scheduler.TaskSchedulerImpl.start(TaskSchedulerImpl.scala:140) at org.apache.spark.SparkContext.(SparkContext.scala:335) at org.apache.spark.api.java.JavaSparkContext.(JavaSparkContext.scala:61) at com.goodwill.cdr.hadoop.spark.PatientCountJHMK.execute(PatientCountJHMK.java:56) at com.goodwill.cdr.hadoop.spark.PatientCountJHMK.main(PatientCountJHMK.java:40) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.spark.deploy.SparkSubmit$.launch(SparkSubmit.scala:358) at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:75) at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
1.Linux版本centos7.5
2.java jdk 1.8
3.hadoop版本2.7.3
4.java環(huán)境變量以及Hadoop環(huán)境變量截圖
5.查看java版本
6.查看haoop版本
7.Hadoop格式華Namenode的截圖圖下
7.1:前面運行截圖
7.2:格式化完成后的最后INFO的顯示
8.最后進入sbin目錄運行./start-dfs.sh(在這之前,我還從新生效了環(huán)境變量)
9.以下是hadoop配置文件截圖 =》core-site.xml:
9.1 core-site.xml:
9.2 hdfs-site.xml:
9.3 mapred-site.xml
9.4 yarn-site.xml:
求個大佬指點一下,這是個什么情況,今天剛剛搭建的服務器。不知道為什么運行不起來。。。。。。SOS SOS SOS
有思路的大佬加請指點值點?。。。。?!
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
問:不同的語言在數(shù)據(jù)處理以及算法計算過程中性能的差別是否很大?
答:就目前的經(jīng)驗來看,使用C或者C++的效率確實要比PYTHON高一些,但是沒有差到一個數(shù)量級的差別。PYTHON程序的維護成本比C或C++感覺還是要略低一些,在生產(chǎn)中可以考慮用硬件數(shù)量進行彌補。
問:請問入門機器學習需要哪些基礎知識呢?
答:如果想走得遠,微積分、概率,這些肯定是跑不了的。 然后就可以是各種聚類分類算法,這部分還是比較好理解的,甚至沒有微積分的知識也基本不影響理解。 最后是深度學習的部分,這部分說實話其實還是挺有難度的。
問:算法模型是自己建造,還是有專家開源
答: 開源的工具能解決很多問題,算法一般不用調(diào)整。但是不排除你在優(yōu)化的時候根據(jù)自己的需求做修改。
問:目前機器學習進行到了哪個階段? 對于軟件功能的自動化測試,是否可以讓機器人自己學習需求,根據(jù)設計文檔來進行測試?
答:理論上確實是可行的。 不過對設計文檔進行特征化的過程恐怕是個非常不確定的過程。 問題一、設計文檔的標準化問題是不是做到位了?問題二、有多少樣本來供訓練?
訓練是一個監(jiān)督學習的過程,要把“文檔”和“對應的測試行為”這樣的關聯(lián)告訴學習引擎才可以。
問:數(shù)學基礎對后面的學習很重要么?我是個高數(shù)很渣的java程序員
答:數(shù)學基礎對后面還是比較重要的,很多書籍里講解算法都有數(shù)學公式推導,至少需要能看懂公式是什么意思
問:在學習前是否要復習下微積分、概率論知識?
答:邊學技術邊復習數(shù)學知識就行,遇到問題再去學習,不用刻意先復習一遍。
問:我做了5年的Web開發(fā)?,F(xiàn)在就職的公司不大,數(shù)據(jù)量也才百萬級。我想知道您對數(shù)據(jù)分析的理解和如何正確利用數(shù)據(jù)分析得到的結果。我想在大數(shù)據(jù)方向有所發(fā)展,希望能在學習路線上給點建議。
答:大數(shù)據(jù)的真實含義不是數(shù)據(jù)量大,而是具有豐富的數(shù)據(jù)維度。數(shù)據(jù)的價值不在于多在于能夠挖掘出有價值的信息從而消除不確定性,降低試錯成本。
很大一部分的數(shù)據(jù)分析是有試探性的,日常的工作中更多的是做指標漲跌的關聯(lián)分析,分析好這些已經(jīng)能為公司解決很多問題了。
其它方面的應用其實不一定在每個公司里都有機會去做,比如推薦系統(tǒng)(典型的機器學習應用場景),如果你的數(shù)據(jù)維度不足夠支撐,或者業(yè)務形態(tài)不是面向大眾的,那很可能無法成行。
學習路線你可以看一下這篇文章: https://my.oschina.net/ijj/blog/878119
問:公司數(shù)據(jù)分析人員如何轉入大數(shù)據(jù)?
答:先學一門容易入門的語言 R 或者pyhton,掌握基礎后再使用它們處理數(shù)據(jù)、分析數(shù)據(jù),我覺得這種對你切入比較容易。
問:我從事兩年JavaWeb最近想轉大數(shù)據(jù)這塊,請問有什么直觀的入門指引呢?
答:入門指引的話,不妨關注一下《Hadoop大數(shù)據(jù)實戰(zhàn)手冊》這里面對大數(shù)據(jù)和Hadoop生態(tài)圈做了比較詳細的介紹,用來入門很不錯。 我個人認為,在大數(shù)據(jù)這個領域還是要跟個人結合,揚長避短,對于是具體做可視化,工程應用,還是分析,這個還是要看個人是否擅長和喜歡。
給大家推薦一套Hadoop教學視頻,老師是百度Hadoop核心架構師。內(nèi)容包括Hadoop入門、Hadoop生態(tài)架構、Hadoop大型商業(yè)項目講解,講的很細致。需要的話可以聯(lián)系微信 ganshiyu1026 ,備注OSC 免費獲取。
問:我目前主要是做一些數(shù)據(jù)統(tǒng)計的工作,想要往推薦系統(tǒng)方向發(fā)展,這塊兒我該怎么學習呢?
答:推薦系統(tǒng)現(xiàn)在用的比較多的是SVM算法或協(xié)同過濾等。 這個內(nèi)容在我看來其實還是貝葉斯信念網(wǎng)絡的延伸或變種,可以看一些關于推薦系統(tǒng)方面的專著。
問:業(yè)界采用的大數(shù)據(jù)解決方案有哪些?
答:現(xiàn)在的框架相對比較成熟的有hadoop,這是做離線處理的; spark可以做離線處理和準實時處理; storm,這是做實時處理的; mahout,spark mllib,離線機器學習; scikit-learn,離線機器學習; tensorflow,torch深度學習。 除此之外還有很多框架,解決方案也是使用這些工程與其它一些開源產(chǎn)品做組合。
問:個人對大數(shù)據(jù)沒有太多的了解,主觀地認為現(xiàn)在的大數(shù)據(jù)都基本是以Hadoop為核心,綜合其他技術,如HBase, Hive等,根據(jù)行業(yè)實際建立相應的分析模型,但不知實施大數(shù)據(jù)項目時,在不同的行業(yè)中有沒有標準的技術路線以及標準的架構呢?
我個人認為不要過于糾結這些。大數(shù)據(jù)的邊界怎么劃分會長期沒有定義,不過有一點是確定的,就是一個人工作的價值。 一個人工作的價值是否能夠幫助公司或者客戶提高效率,消除不確定性,減小試錯成本,找出好的改進方向,這些才是價值所在。 至于某一個工具都是有適用場景的,在不同項目里進行有側重的選擇使用就可以了。
問:個人對大數(shù)據(jù)的理解就是歷史數(shù)據(jù)產(chǎn)生了很多,然后多表查詢時效率很慢,怎么用一些緩存或數(shù)據(jù)庫中間件解決性能的事?
答:如果單純從你說的這個場景來看,應該屬于海量數(shù)據(jù)存儲的研究范疇。 大部分都是用類似分布式存儲、表分區(qū)、索引、壓縮存儲等手段進行解決。 這個應該不屬于大數(shù)據(jù)研究的重點。
問:機器學習有哪些最新的理論知識?如果要實現(xiàn)機器學習,業(yè)界是否有成熟的開源方案?
答:最新的理論知識多用google進行相關論文的查詢,更新還是比較快的。
機器學習開源方案有不少,我們用的是scikit-learn,是python語言的框架,已經(jīng)能解決不少問題了。
問:在大數(shù)據(jù)領域,機器學習首先應該是有足夠多的數(shù)據(jù)來支撐其運算吧,但其實很多現(xiàn)實是數(shù)據(jù)量并沒有到達那個級別,或者數(shù)據(jù)維度還有許多尚不被我們所認知。所以,有沒有一個相對清晰的分界線,哪些情況下就可以使用機器學習,哪些還不足夠呢?
答:在神經(jīng)網(wǎng)絡出現(xiàn)之前,對于特征抽取比較準確,解釋比較清晰的領域都是可以使用機器學習的。 在神經(jīng)網(wǎng)絡出現(xiàn)之后,尤其是卷積神經(jīng)網(wǎng)絡出現(xiàn)之后,對于模式識別方面的加強是令人矚目的。很多原來使用隨機森林或者SVM都無法處理得很好的模式識別問題都有了進展。 如果一定要劃界限的話,我想可以從特征提取的難易程度上來做劃分。如果特征很難提取,甚至特征完全不明確,則十有八九在機器學習過程中得不到令人滿意的模型解
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
1.用戶數(shù)千萬級
2.標簽最高支持上萬
3.標簽會逐漸增多
4.支持依據(jù)多個標簽進行查詢,統(tǒng)計數(shù)量(秒級響應)(這是重點)
用什么存儲能實現(xiàn)?
Hbase 貌似不支持第4條
ES的話,數(shù)據(jù)量多了增加標簽會很耗時
Neo4j?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
我的問題:
環(huán)境:Hadoop2.6.0
jdk: 1.8.0_121
問題描述:
當下面程序中的輸入文件目錄(/init_data/)中 存在文件時,能夠在輸出目錄中查看到輸出文件,但是文件內(nèi)容時空的,
當下面程序中的輸入文件目錄(/init_data/)中 不存在文件時,在輸出目錄中看不到文件,同時程序也沒有存在錯誤!
那么想問的是,這個是怎么回事?
我的代碼: package com.yangsen; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.io.IOException; public class mapreduce { public static void main(String[] args) throws IOException { Configuration conf = new Configuration(); conf.set("fs.defaultFS","hdfs://192.168.100.112:9000"); //conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem"); Job job = Job.getInstance(conf,"kieryum"); job.setOutputKeyClass(Text.class); job.setOutputValueClass(NullWritable.class); job.setJarByClass(mapreduce.class); job.setMapperClass(MyMapper.class); job.setNumReduceTasks(4); FileInputFormat.addInputPath(job, new Path("hdfs://192.168.100.112:9000/init_data")); //設置輸出路徑 Path output = new Path("hdfs://192.168.100.112:9000/clear_data"); //強制刪除輸出路徑 output.getFileSystem(conf).delete(output,true); FileOutputFormat.setOutputPath(job, output); try { job.waitForCompletion(true); } catch (InterruptedException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } //System.out.println(job.getJobFile()); } class MyMapper extends Mapper { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { value.set("dd"); context.write(value,NullWritable.get()); } } }
結果圖:
運行結果:
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
用的主備mysql,目前mysql高峰期一直沖高,有什么成熟的db解決方案
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
hadoop mapper :
mapper 輸出的時 在reduce的時候 怎么知道reduce的輸入類型的?
mapper : reduce :
output: input:
text --> IntWriteable text --> iteratable
text --> IntWriteable text --> iteratable
text --> IntWriteable text --> iteratable
這種關系時怎么對應的?
謝謝你們的回答
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
Apache kylin build cube fial log is "no counters for job"
I created a model olap left join dimension table ,and build success.
But olap inner join dimension table ,build cube fial.
Who can help me?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> http://www.blogjava.net/ghostdog/archive/2008/06/10/206874.html
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
1、點評
本文主要分享的是如何從零設計開發(fā)一個中大型推送系統(tǒng),因限于篇幅,文中有些鍵技術只能一筆帶過,建議有這方面興趣的讀者可以深入研究相關知識點,從而形成橫向知識體系。
本文適合有一定開發(fā)、架構經(jīng)驗的后端程序員閱讀,文內(nèi)個別技術點可能并非最佳實踐,但至少都是生動的實踐分享,至少能起到拋磚引玉的作用。希望即時通訊網(wǎng)本次整理的文章能給予你一些啟發(fā)。
(本文同步發(fā)布于: http://www.52im.net/thread-2096-1-1.html )
2、引言
先簡單介紹下本次要分享的主題,由于我最近做的是物聯(lián)網(wǎng)相關的開發(fā)工作,其中就不免會遇到和設備的數(shù)據(jù)通信(交互)。其中最主要的工作就是要有一個系統(tǒng)來支持設備的接入、向設備推送消息,同時還得滿足大量設備接入的需求。
正好借本文,總結和沉淀一下近期的技術心得。
所以本次分享的內(nèi)容不但可以滿足物聯(lián)網(wǎng)領域同時還支持以下場景:
1)基于 WEB 的聊天系統(tǒng)(點對點、群聊);
2)WEB 應用中需求服務端推送的場景;
3)基于 SDK 的消息推送平臺。
3、關于作者
crossoverJie(陳杰): 90后,畢業(yè)于重慶信息工程學院,現(xiàn)供職于重慶豬八戒網(wǎng)絡有限公司。
作者的博客: https://crossoverjie.top
作者的Github: https://github.com/crossoverJie
4、技術選型
要滿足大量的連接數(shù)、同時支持雙全工通信,并且性能也得有保障。在 Java 技術棧中進行選型首先自然是排除掉了傳統(tǒng) IO。
那就只有選 NIO 了,在這個層面其實選擇也不多,考慮到社區(qū)、資料維護等方面最終選擇了 Netty。
Netty源碼在線閱讀: Netty-4.1.x地址是: http://docs.52im.net/extend/docs/src/netty4_1/
Netty-4.0.x地址是: http://docs.52im.net/extend/docs/src/netty4/
Netty-3.x地址是: http://docs.52im.net/extend/docs/src/netty3/
Netty在線API文檔: Netty-4.1.x API文檔(在線版): http://docs.52im.net/extend/docs/api/netty4_1/
Netty-4.0.x API文檔(在線版): http://docs.52im.net/extend/docs/api/netty4/
Netty-3.x API文檔(在線版): http://docs.52im.net/extend/docs/api/netty3/
有關Netty的其它精華文章: 《 有關“為何選擇Netty”的11個疑問及解答 》
《 開源NIO框架八卦——到底是先有MINA還是先有Netty? 》
《 選Netty還是Mina:深入研究與對比(一) 》
《 選Netty還是Mina:深入研究與對比(二) 》
《 Netty 4.x學習(一):ByteBuf詳解 》
《 Netty 4.x學習(二):Channel和Pipeline詳解 》
《 Netty 4.x學習(三):線程模型詳解 》
《 實踐總結:Netty3.x升級Netty4.x遇到的那些坑(線程篇) 》
《 實踐總結:Netty3.x VS Netty4.x的線程模型 》
《 詳解Netty的安全性:原理介紹、代碼演示(上篇) 》
《 詳解Netty的安全性:原理介紹、代碼演示(下篇) 》
《 詳解Netty的優(yōu)雅退出機制和原理 》
《 NIO框架詳解:Netty的高性能之道 》
《 Twitter:如何使用Netty 4來減少JVM的GC開銷(譯文) 》
《 絕對干貨:基于Netty實現(xiàn)海量接入的推送服務技術要點 》
《 Netty干貨分享:京東京麥的生產(chǎn)級TCP網(wǎng)關技術實踐總結 》
最終的架構圖如下:
現(xiàn)在看著蒙沒關系,下文一一介紹。
5、協(xié)議解析
既然是一個消息系統(tǒng),那自然得和客戶端定義好雙方的協(xié)議格式。
常見和簡單的是 HTTP 協(xié)議,但我們的需求中有一項需要是雙全工的交互方式,同時 HTTP 更多的是服務于瀏覽器。我們需要的是一個更加精簡的協(xié)議,減少許多不必要的數(shù)據(jù)傳輸。
因此我覺得最好是在滿足業(yè)務需求的情況下定制自己的私有協(xié)議,在這個場景下有標準的物聯(lián)網(wǎng)協(xié)議。
如果是其他場景可以借鑒現(xiàn)在流行的 RPC 框架定制私有協(xié)議,使得雙方通信更加高效。
不過根據(jù)這段時間的經(jīng)驗來看,不管是哪種方式都得在協(xié)議中預留安全相關的位置。協(xié)議相關的內(nèi)容就不過多討論了,更多介紹具體的應用。
有關通信協(xié)議、協(xié)議格式的選擇,可以閱讀以下文章: 《 Protobuf通信協(xié)議詳解:代碼演示、詳細原理介紹等 》
《 一個基于Protocol Buffer的Java代碼演示 》
《 簡述傳輸層協(xié)議TCP和UDP的區(qū)別 》
《 為什么QQ用的是UDP協(xié)議而不是TCP協(xié)議? 》
《 移動端即時通訊協(xié)議選擇:UDP還是TCP? 》
《 如何選擇即時通訊應用的數(shù)據(jù)傳輸格式 》
《 強列建議將Protobuf作為你的即時通訊應用數(shù)據(jù)傳輸格式 》
《 全方位評測:Protobuf性能到底有沒有比JSON快5倍? 》
《 移動端IM開發(fā)需要面對的技術問題(含通信協(xié)議選擇) 》
《 簡述移動端IM開發(fā)的那些坑:架構設計、通信協(xié)議和客戶端 》
《 理論聯(lián)系實際:一套典型的IM通信協(xié)議設計詳解 》
《 58到家實時消息系統(tǒng)的協(xié)議設計等技術實踐分享 》
《 詳解如何在NodeJS中使用Google的Protobuf 》
《 技術掃盲:新一代基于UDP的低延時網(wǎng)絡傳輸層協(xié)議——QUIC詳解 》
《 金蝶隨手記團隊分享:還在用JSON? Protobuf讓數(shù)據(jù)傳輸更省更快(原理篇) 》
《 金蝶隨手記團隊分享:還在用JSON? Protobuf讓數(shù)據(jù)傳輸更省更快(實戰(zhàn)篇) 》
>> 更多同類文章 ……
6、簡單實現(xiàn)
首先考慮如何實現(xiàn)功能,再來思考百萬連接的情況。
6.1 注冊鑒權
在做真正的消息上、下行之前首先要考慮的就是鑒權問題。就像你使用微信一樣,第一步怎么也得是登錄吧,不能無論是誰都可以直接連接到平臺。所以第一步得是注冊才行。
如上面第4節(jié)架構圖中的注冊/鑒權模塊。通常來說都需要客戶端通過 HTTP 請求傳遞一個唯一標識,后臺鑒權通過之后會響應一個 Token,并將這個 Token 和客戶端的關系維護到 Redis 或者是 DB 中。
客戶端將這個 Token 也保存到本地,今后的每一次請求都得帶上這個 Token。一旦這個 Token 過期,客戶端需要再次請求獲取 Token。
鑒權通過之后客戶端會直接通過 TCP 長連接到圖中的 push-server 模塊。這個模塊就是真正處理消息的上、下行。
6.2 保存通道關系
在連接接入之后,真正處理業(yè)務之前需要將當前的客戶端和 Channel 的關系維護起來。
假設客戶端的唯一標識是手機號碼,那就需要把手機號碼和當前的 Channel 維護到一個 Map 中。
這點和之前 Spring Boot 整合長連接心跳機制 類似,如下圖:
同時為了可以通過 Channel 獲取到客戶端唯一標識(手機號碼),還需要在 Channel 中設置對應的屬性: publicstaticvoidputClientId(Channel channel, String clientId) {
channel.attr(CLIENT_ID).set(clientId);
}
獲取手機號碼時: publicstaticString getClientId(Channel channel) {
return(String)getAttribute(channel, CLIENT_ID);
}
這樣當我們客戶端下線時便可以記錄相關日志:
String telNo = NettyAttrUtil.getClientId(ctx.channel()); NettySocketHolder.remove(telNo);
log.info("客戶端下線,TelNo="+ telNo);
這里有一點需要注意:存放客戶端與 Channel 關系的 Map 最好是預設好大?。ū苊饨?jīng)常擴容),因為它將是使用最為頻繁同時也是占用內(nèi)存最大的一個對象。
6.3 消息上行
接下來則是真正的業(yè)務數(shù)據(jù)上傳,通常來說第一步是需要判斷上傳消息輸入什么業(yè)務類型。在聊天場景中,有可能上傳的是文本、圖片、視頻等內(nèi)容。
所以我們得進行區(qū)分,來做不同的處理,這就和客戶端協(xié)商的協(xié)議有關了:
1)可以利用消息頭中的某個字段進行區(qū)分;
2)更簡單的就是一個 JSON 消息,拿出一個字段用于區(qū)分不同消息。
不管是哪種只要可以區(qū)分出來即可。
6.4 消息解析與業(yè)務解耦
消息可以解析之后便是處理業(yè)務,比如可以是寫入數(shù)據(jù)庫、調(diào)用其他接口等。
我們都知道在 Netty 中處理消息一般是在 channelRead() 方法中:
在這里可以解析消息,區(qū)分類型。但如果我們的業(yè)務邏輯也寫在里面,那這里的內(nèi)容將是巨多無比。
甚至我們分為好幾個開發(fā)來處理不同的業(yè)務,這樣將會出現(xiàn)許多沖突、難以維護等問題。所以非常有必要將消息解析與業(yè)務處理完全分離開來。
這時面向接口編程就發(fā)揮作用了。這里的核心代碼和 「造個輪子」—— cicada(輕量級 Web 框架) 是一致的(另外,即時通訊網(wǎng)的 MobileIMSDK工程 也使用了同樣的API解偶設計思路)。
都是先定義一個接口用于處理業(yè)務邏輯,然后在解析消息之后通過反射創(chuàng)建具體的對象執(zhí)行其中的處理函數(shù)即可。
這樣不同的業(yè)務、不同的開發(fā)人員只需要實現(xiàn)這個接口同時實現(xiàn)自己的業(yè)務邏輯即可。
偽代碼如下:
想要了解 cicada 的具體實現(xiàn)請點擊這里:
https://github.com/TogetherOS/cicada
上行還有一點需要注意:由于是基于長連接,所以客戶端需要定期發(fā)送心跳包用于維護本次連接。
同時服務端也會有相應的檢查,N 個時間間隔沒有收到消息之后,將會主動斷開連接節(jié)省資源。
這點使用一個 IdleStateHandler 就可實現(xiàn)。
6.5 消息下行
有了上行自然也有下行。比如在聊天的場景中,有兩個客戶端連上了 push-server,它們直接需要點對點通信。
這時的流程是:
1)A 將消息發(fā)送給服務器;
2)服務器收到消息之后,得知消息是要發(fā)送給 B,需要在內(nèi)存中找到 B 的 Channel;
3)通過 B 的 Channel 將 A 的消息轉發(fā)下去。
這就是一個下行的流程。甚至管理員需要給所有在線用戶發(fā)送系統(tǒng)通知也是類似:遍歷保存通道關系的 Map,挨個發(fā)送消息即可。這也是之前需要存放到 Map 中的主要原因。
偽代碼如下:
具體可以參考:
https://github.com/crossoverJie/netty-action/
7、分布式方案
單機版的實現(xiàn)了,現(xiàn)在著重講講如何實現(xiàn)百萬連接。
百萬連接其實只是一個形容詞,更多的是想表達如何來實現(xiàn)一個分布式的方案,可以靈活的水平拓展從而能支持更多的連接。在做這個事前,首先得搞清楚我們單機版的能支持多少連接。
影響這個的因素就比較多了:
1)服務器自身配置:內(nèi)存、CPU、網(wǎng)卡、Linux 支持的最大文件打開數(shù)等;
2)應用自身配置:因為 Netty 本身需要依賴于堆外內(nèi)存,但是 JVM 本身也是需要占用一部分內(nèi)存的,比如存放通道關系的大 Map。這點需要結合自身情況進行調(diào)整。
結合以上的情況可以測試出單個節(jié)點能支持的最大連接數(shù)。單機無論怎么優(yōu)化都是有上限的,這也是分布式主要解決的問題。
7.1 架構介紹
在講具體實現(xiàn)之前首先得講講上文貼出的整體架構圖:
先從左邊開始。上文提到的注冊鑒權模塊也是集群部署的,通過前置的 Nginx 進行負載。之前也提過了它主要的目的是來做鑒權并返回一個 Token 給客戶端。
但是 push-server 集群之后它又多了一個作用。那就是得返回一臺可供當前客戶端使用的 push-server。
右側的平臺一般指管理平臺,它可以查看當前的實時在線數(shù)、給指定客戶端推送消息等。推送消息則需要經(jīng)過一個推送路由(push-server)找到真正的推送節(jié)點。
其余的中間件如: Redis、ZooKeeper、Kafka、MySQL 都是為了這些功能所準備的,具體看下面的實現(xiàn)。
7.2 注冊發(fā)現(xiàn)
首先第一個問題則是 注冊發(fā)現(xiàn),push-server 變?yōu)槎嗯_之后如何給客戶端選擇一臺可用的節(jié)點是第一個需要解決的。
這塊的內(nèi)容其實已經(jīng)在 分布式(一) 搞定服務注冊與發(fā)現(xiàn)中詳細講過了。所有的 push-server 在啟動時候需要將自身的信息注冊到 ZooKeeper 中。
注冊鑒權模塊會訂閱 ZooKeeper 中的節(jié)點,從而可以獲取最新的服務列表,結構如下:
以下是一些偽代碼: 應用啟動注冊 ZooKeeper
對于注冊鑒權模塊來說只需要訂閱這個 ZooKeeper 節(jié)點:
7.3 路由策略
既然能獲取到所有的服務列表,那如何選擇一臺剛好合適的 push-server 給客戶端使用呢?
這個過程重點要考慮以下幾點:
1)盡量保證各個節(jié)點的連接均勻;
2)增刪節(jié)點是否要做 Rebalance。
首先保證均衡有以下幾種算法:
1)輪詢:挨個將各個節(jié)點分配給客戶端。但會出現(xiàn)新增節(jié)點分配不均勻的情況;
2)Hash 取模的方式:類似于 HashMap,但也會出現(xiàn)輪詢的問題。當然也可以像 HashMap 那樣做一次 Rebalance,讓所有的客戶端重新連接。不過這樣會導致所有的連接出現(xiàn)中斷重連,代價有點大。由于 Hash 取模方式的問題帶來了一致性 Hash 算法,但依然會有一部分的客戶端需要 Rebalance;
3)權重:可以手動調(diào)整各個節(jié)點的負載情況,甚至可以做成自動的,基于監(jiān)控當某些節(jié)點負載較高就自動調(diào)低權重,負載較低的可以提高權重。
還有一個問題是: 當我們在重啟部分應用進行升級時,在該節(jié)點上的客戶端怎么處理?
由于我們有心跳機制,當心跳不通之后就可以認為該節(jié)點出現(xiàn)問題了。那就得重新請求注冊鑒權模塊獲取一個可用的節(jié)點。在弱網(wǎng)情況下同樣適用。
如果這時客戶端正在發(fā)送消息,則需要將消息保存到本地等待獲取到新的節(jié)點之后再次發(fā)送。
7.4 有狀態(tài)連接
在這樣的場景中不像是 HTTP 那樣是無狀態(tài)的,我們得明確的知道各個客戶端和連接的關系。
在上文的單機版中我們將這個關系保存到本地的緩存中,但在分布式環(huán)境中顯然行不通了。
比如在平臺向客戶端推送消息的時候,它得首先知道這個客戶端的通道保存在哪臺節(jié)點上。
借助我們以前的經(jīng)驗,這樣的問題自然得引入一個第三方中間件用來存放這個關系。
也就是架構圖中的存放路由關系的 Redis,在客戶端接入 push-server 時需要將當前客戶端唯一標識和服務節(jié)點的 ip+port 存進 Redis。
同時在客戶端下線時候得在 Redis 中刪掉這個連接關系。這樣在理想情況下各個節(jié)點內(nèi)存中的 Map 關系加起來應該正好等于 Redis 中的數(shù)據(jù)。
偽代碼如下:
這里存放路由關系的時候會有并發(fā)問題,最好是換為一個 Lua 腳本。
7.5 推送路由
設想這樣一個場景: 管理員需要給最近注冊的客戶端推送一個系統(tǒng)消息會怎么做?
結合架構圖,假設這批客戶端有 10W 個,首先我們需要將這批號碼通過平臺下的 Nginx 下發(fā)到一個推送路由中。
為了提高效率甚至可以將這批號碼再次分散到每個 push-route 中。拿到具體號碼之后再根據(jù)號碼的數(shù)量啟動多線程的方式去之前的路由 Redis 中獲取客戶端所對應的 push-server。
再通過 HTTP 的方式調(diào)用 push-server 進行真正的消息下發(fā)(Netty 也很好的支持 HTTP 協(xié)議)。
推送成功之后需要將結果更新到數(shù)據(jù)庫中,不在線的客戶端可以根據(jù)業(yè)務再次推送等。
7.6 消息流轉
也許有些場景對于客戶端上行的消息非常看重,需要做持久化,并且消息量非常大。
在 push-sever 做業(yè)務顯然不合適,這時完全可以選擇 Kafka 來解耦。將所有上行的數(shù)據(jù)直接往 Kafka 里丟后就不管了。再由消費程序?qū)?shù)據(jù)取出寫入數(shù)據(jù)庫中即可。
8、分布式帶來的問題
分布式解決了性能問題但卻帶來了其他麻煩。
8.1 應用監(jiān)控
比如如何知道線上幾十個 push-server 節(jié)點的健康狀況?這時就得監(jiān)控系統(tǒng)發(fā)揮作用了,我們需要知道各個節(jié)點當前的內(nèi)存使用情況、GC。
以及操作系統(tǒng)本身的內(nèi)存使用,畢竟 Netty 大量使用了堆外內(nèi)存。同時需要監(jiān)控各個節(jié)點當前的在線數(shù),以及 Redis 中的在線數(shù)。理論上這兩個數(shù)應該是相等的。
這樣也可以知道系統(tǒng)的使用情況,可以靈活的維護這些節(jié)點數(shù)量。
8.2 日志處理
日志記錄也變得異常重要了,比如哪天反饋有個客戶端一直連不上,你得知道問題出在哪里。
最好是給每次請求都加上一個 traceID 記錄日志,這樣就可以通過這個日志在各個節(jié)點中查看到底是卡在了哪里。以及 ELK 這些工具都得用起來才行。
9、本文小結
本次是結合我日常經(jīng)驗得出的,有些坑可能在工作中并沒有踩到,所以還會有一些遺漏的地方。
就目前來看想做一個穩(wěn)定的推送系統(tǒng)是比較麻煩的,其中涉及到的點非常多,只有真正做過之后才會知道。
附錄:更多推送技術相關文章 《 iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等 》
《 信鴿團隊原創(chuàng):一起走過 iOS10 上消息推送(APNS)的坑 》
《 Android端消息推送總結:實現(xiàn)原理、心跳?;?、遇到的問題等 》
《 掃盲貼:認識MQTT通信協(xié)議 》
《 一個基于MQTT通信協(xié)議的完整Android推送Demo 》
《 IBM技術經(jīng)理訪談:MQTT協(xié)議的制定歷程、發(fā)展現(xiàn)狀等 》
《 求教android消息推送:GCM、XMPP、MQTT三種方案的優(yōu)劣 》
《 移動端實時消息推送技術淺析 》
《 掃盲貼:淺談iOS和Android后臺實時消息推送的原理和區(qū)別 》
《 絕對干貨:基于Netty實現(xiàn)海量接入的推送服務技術要點 》
《 移動端IM實踐:谷歌消息推送服務(GCM)研究(來自微信) 》
《 為何微信、QQ這樣的IM工具不使用GCM服務推送消息? 》
《 極光推送系統(tǒng)大規(guī)模高并發(fā)架構的技術實踐分享 》
《 從HTTP到MQTT:一個基于位置服務的APP數(shù)據(jù)通信實踐概述 》
《 魅族2500萬長連接的實時消息推送架構的技術實踐分享 》
《 專訪魅族架構師:海量長連接的實時消息推送系統(tǒng)的心得體會 》
《 深入的聊聊Android消息推送這件小事 》
《 基于WebSocket實現(xiàn)Hybrid移動應用的消息推送實踐(含代碼示例) 》
《 一個基于長連接的安全可擴展的訂閱/推送服務實現(xiàn)思路 》
《 實踐分享:如何構建一套高可用的移動端消息推送系統(tǒng)? 》
《 Go語言構建千萬級在線的高并發(fā)消息推送系統(tǒng)實踐(來自360公司) 》
《 騰訊信鴿技術分享:百億級實時消息推送的實戰(zhàn)經(jīng)驗 》
《 百萬在線的美拍直播彈幕系統(tǒng)的實時推送技術實踐之路 》
《 京東京麥商家開放平臺的消息推送架構演進之路 》
《 了解iOS消息推送一文就夠:史上最全iOS Push技術詳解 》
《 基于APNs最新HTTP/2接口實現(xiàn)iOS的高性能消息推送(服務端篇) 》
《 解密“達達-京東到家”的訂單即時派發(fā)技術原理和實踐 》
《 技術干貨:從零開始,教你設計一個百萬級的消息推送系統(tǒng) 》
>> 更多同類文章 ……
(本文同步發(fā)布于: http://www.52im.net/thread-2096-1-1.html )
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> java.io.IOException: 遠程主機強迫關閉了一個現(xiàn)有的連接。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233) at sun.nio.ch.IOUtil.read(IOUtil.java:206) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:236) at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:280) at org.apache.mina.transport.socket.nio.NioProcessor.read(NioProcessor.java:44) at org.apache.mina.core.polling.AbstractPollingIoProcessor.read(AbstractPollingIoProcessor.java:695) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:668) at org.apache.mina.core.polling.AbstractPollingIoProcessor.process(AbstractPollingIoProcessor.java:657) at org.apache.mina.core.polling.AbstractPollingIoProcessor.access$600(AbstractPollingIoProcessor.java:68) at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:1141) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619)
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> Apache Mina 如何做負載均衡,或是集群,因特網(wǎng)上現(xiàn)在都沒有找到現(xiàn)成成熟的解決方案,大家有沒有思路???
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
各位好,想請教一個比較奇怪的問題。在項目中,通過mina接受遠程telnet命令,然后將命令中的請求參數(shù)放到消息隊列里面,由消費者端去異步處理。但是在測試過程中發(fā)現(xiàn),第一次的telnet命令,mq消費者端日志顯示確認完成,但是onMessage方法日志內(nèi)并未打印,業(yè)務代碼就沒執(zhí)行。但是第二次發(fā)送同一個命令之后,一切就正常了。
1. spring-mq配置文件
2. consumer端代碼 @Component("workerListener") public class LaneWorkerListener implements ChannelAwareMessageListener { private static final Logger log = LoggerFactory.getLogger(LaneWorkerListener.class); @Autowired private LaneProcessor processor; public LaneWorkerListener() { } public void onMessage(Message message, Channel channel) throws Exception { try { Object receivedObject = SerializationUtils.deserialize(message.getBody()); log.info("消費者端接收到消息:{}, 消息properties:{} ", receivedObject, message.getMessageProperties()); // business operations. if (receivedObject instanceof ParamsWrapper) { ParamsWrapper wrapper = (ParamsWrapper) receivedObject; processor.process(SessionManager.getSession(wrapper.getSessionId()), wrapper.getParams()); } channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); // false只確認當前一個消息收到,true確認所有consumer獲得的消息 } catch (Exception e) { log.error(String.format("消息確認失敗,詳細信息:", e)); if (message.getMessageProperties().getRedelivered()) { log.error("消息MessageId:{}已重復處理失敗,拒絕再次接收...", message.getMessageProperties().getMessageId()); channel.basicReject(message.getMessageProperties().getDeliveryTag(), false); // 拒絕消息 } else { log.error("消息MessageId:{}即將再次返回隊列處理...", message.getMessageProperties().getMessageId()); channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true); // requeue為是否重新回到隊列 } } } }
3.另外還有兩個確認機制的監(jiān)聽器 @Component("callbackListener") public class LaneWorkerCallbackListener implements ConfirmCallback { private static final Logger log = Logger.getLogger(LaneWorkerCallbackListener.class); public void confirm(CorrelationData correlationData, boolean ack, String cause) { log.info(String.format("確認消息完成...,{%s},{%s},{%s}", correlationData, ack, cause)); } } @Component("returnCallbackListener") public class LaneWorkerReturnedCallbackListener implements ReturnCallback { private static final Logger log = Logger.getLogger(LaneWorkerCallbackListener.class); public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { log.info(String.format("消息返回處理中...,{%s},{%s},{%s},{%s},{%s}", message, replyCode, replyText,exchange,routingKey)); } }
在mina中的消息發(fā)送:
1. mina spring 配置
2. 主要的消息接受處理handler ServerIOHandler @Service public class ServerIoHandler extends IoHandlerAdapter { private static final Logger LOGGER = Logger.getLogger(ServerIoHandler.class); @Autowired private CacheManager cacheManager; @Autowired private ILaneMessageProducer producer; @Autowired private LaneQueueContainer queues; @Override public void sessionCreated(IoSession session) throws Exception { //為session設置唯一主鍵id,暫用毫秒時間戳策略。緩存session session.setAttributeIfAbsent(LaneConstants.MINA_SESSION_PRIMARY_KEY, System.currentTimeMillis()); Object sessionId = session.getAttribute(LaneConstants.MINA_SESSION_PRIMARY_KEY); SessionManager.addSession(Long.valueOf(sessionId.toString()), session); //并且存在緩存中 String address = ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress(); cacheManager.setPerpetual(LaneConfig.getEnv().concat(LaneConstants.CACHE_LANE_SESSION_KEY), address); } @Override public void messageReceived(IoSession session, Object message) throws Exception { try { LOGGER.info(String.format("Start: [%s] -- address:[%s]",message.toString(),session.getRemoteAddress().toString())); // 解密消息 if (LaneConfig.isEncryptedMsg()) { message = AESUtils.decrypt(message.toString()); } JSONObject msg = parseParam(message.toString()); Long spid = Long.valueOf(session.getAttribute(LaneConstants.MINA_SESSION_PRIMARY_KEY).toString());//session id. //消息存入消息隊列 producer.sendMessage(queues.getQueueLane(), new ParamsWrapper(spid, msg)); LOGGER.info(String.format(">>>>>>消息{%s}已被放入隊列中.....時間:[%s]", message.toString(),DateUtils.getCurrentDateTimeMilliSecond(new Date()))); } catch (Exception e) { SocketResponse srs = new SocketResponse(); srs.setCode(SocketResponse.INTERNAL_SERVER_ERROR); srs.setMsg("內(nèi)部錯誤"); session.write(LaneUtils.parseReturn(srs)); LOGGER.error("Exception:", e); } finally { message = null; } }
還請各位大俠多多指點。。。。謝謝!
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 如題,Netty和MINA該如何選擇,如果選擇Netty該用哪個版本?謝謝!
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
我的項目要求在客戶端連接到服務器的時候,就會時時的給他每秒一次的推送數(shù)據(jù),還有其他的數(shù)據(jù)有的是5秒一次,有的是1分一次。我試著自己建了多個線程傳入ISsession 發(fā)送數(shù)據(jù) 總是報錯。如果只開啟一個線程就正常。
下面是hander中的代碼: @Override public void sessionOpened(IoSession session) throws Exception { System.out.println("【server】sessionOpened ID:" + session.getId()); if (allIoSessions == null) { allIoSessions = session.getService().getManagedSessions(); } System.out.println("有人連接,當前客戶數(shù):" + allIoSessions.size()); new Thread(new AllPoliceCoordsThread(session, service)).start(); new Thread(new HotPoliceCoordsThread(session, service)).start(); new Thread(new UserCoordsThread(session, service)).start(); }
注釋掉兩個線程的話,只留一個(1秒發(fā)一次)就正常了。可是如果把頻率改成1毫秒一次。就算一個線程也要不停地報錯
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 信息: Initializing Spring root WebApplicationContext2017-01-06 17:33:12:670[ERROR]: Context initialization failed java.lang.NoClassDefFoundError: org/springframework/core/DefaultParameterNameDiscoverer at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.(AbstractAutowireCapableBeanFactory.java:123) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.(AbstractAutowireCapableBeanFactory.java:170) at org.springframework.beans.factory.support.DefaultListableBeanFactory.(DefaultListableBeanFactory.java:171) at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:127) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5077) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5591) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.springframework.core.DefaultParameterNameDiscoverer at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1856) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1705) ... 19 more 一月 06, 2017 5:33:12 下午 org.apache.catalina.core.StandardContext listenerStart 嚴重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.NoClassDefFoundError: org/springframework/core/DefaultParameterNameDiscoverer at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.(AbstractAutowireCapableBeanFactory.java:123) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.(AbstractAutowireCapableBeanFactory.java:170) at org.springframework.beans.factory.support.DefaultListableBeanFactory.(DefaultListableBeanFactory.java:171) at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:127) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5077) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5591) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.ClassNotFoundException: org.springframework.core.DefaultParameterNameDiscoverer at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1856) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1705) ... 19 more 一月 06, 2017 5:33:12 下午 org.apache.catalina.core.StandardContext startInternal 嚴重: One or more listeners failed to start. Full details will be found in the appropriate container log file 一月 06, 2017 5:33:13 下午 org.apache.catalina.core.StandardContext startInternal 嚴重: Context [/grain_detection] startup failed due to previous errors 一月 06, 2017 5:33:13 下午 org.apache.catalina.core.ApplicationContext log 信息: Closing Spring root WebApplicationContext 一月 06, 2017 5:33:13 下午 org.apache.catalina.core.StandardContext listenerStop 嚴重: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:171) at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1090) at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1064) at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010) at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:586) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5124) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5786) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
最近接了個項目,需要用異步單工長連接,同銀聯(lián)方進行交互,因為對方用的就是這實現(xiàn),但是我們用的是mina同步短連接,這里我試了mina的異步長短通訊、socket的通訊、netty的通訊連接,都不完美,第一個,多幾筆,提示hander未關閉,第二個發(fā)過去的數(shù)據(jù)對方不認識。第三個,發(fā)過去但收不到響應。。。。,用短連接發(fā)送再加一個client端口啟動接收,能發(fā)能收,但并發(fā)量和接收數(shù)據(jù)處理這塊也容易混亂!求大神指導下,或者給個這種類型的demo 灰常感謝!?。?
demo:
sendMsg(Object msg) throws CharacterCodingException, UnsupportedEncodingException{
NioSocketConnector connector = new NioSocketConnector();
//connector.getSessionConfig().setIdleTime(IdleStatus.WRITER_IDLE,10); //寫 通道均在10 秒內(nèi)無任何操作就進入空閑狀態(tài)
//connector.getSessionConfig().setIdleTime(IdleStatus.READER_IDLE,10); //讀 通道均在10 秒內(nèi)無任何操作就進入空閑狀態(tài)
connector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10); //讀寫 通道均在10 秒內(nèi)無任何操作就進入空閑狀態(tài)
connector.getSessionConfig().setWriteTimeout(3000);
connector.getSessionConfig().setReadBufferSize(2048);
connector.setConnectTimeoutMillis(4000);
connector.getFilterChain().addLast("codec", CODEC_FILTER);
connector.setHandler(new MinaClientHander() );
ConnectFuture cf = connector.connect(new InetSocketAddress(IP,PORT));
cf.join();
// 等待連接成功
cf.awaitUninterruptibly();
IoSession session = cf.getSession();
System.out.println("開始發(fā)消息【"+msg+"】去通道方?。?!");
if(msg.toString().length()>20){
String msgStr = "";
Charset charset =Charset.forName("ISO-8859-1");
CharsetEncoder encoder = charset.newEncoder();
if (msg instanceof byte[])
{
msgStr = new String((byte[]) msg, "ISO-8859-1");
} else
{
msgStr = msg.toString();
}
String value;
value =setMsgLength(msgStr);
IoBuffer buf = IoBuffer.allocate(value.length())
.setAutoExpand(true);
buf.putString(value, encoder);
buf.flip();
System.out.println("MsgHeadProcess 報文發(fā)送編碼 【 " + new Date(System.currentTimeMillis())
+ "】 data【" +buf.getHexDump());
session.write(buf);
session.getCloseFuture().awaitUninterruptibly();// 等待連接斷開
connector.dispose();
session.close();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else{
session.write(msg);
session.getCloseFuture().awaitUninterruptibly();// 等待連接斷開
connector.dispose();
session.close();
}
static{
// 服務端的實例
NioSocketAcceptor accept = new NioSocketAcceptor();
// 添加filter
accept.getFilterChain().addLast("codec",new ProtocolCodecFilter(
new MinaEncoder(),
new MinaDecoder()
));
// 添加filter,日志信息
// accept.getFilterChain().addLast("logging", new LoggingFilter());
// 添加線程池
accept.getFilterChain().addLast("ThreadPool", new ExecutorFilter(Executors.newCachedThreadPool()));
accept.getSessionConfig().setReadBufferSize(2048);
accept.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
// 設置服務端的handler
accept.setHandler(new MinaServerHander());
try {
int PORT=10006;
accept.bind(new InetSocketAddress(PORT));
log.info("服務端啟動!端口:"+PORT);
} catch (IOException e) {
log.error("socket listener start exception", e);
}
log.info("mina server started.");
}
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
需求:大量無線傳感器(2000-3000)需要定時向服務器發(fā)送請求,提交數(shù)據(jù)。想到的解決方案是mina,不知道對不對。
客戶端要請求服務器,查看傳感器傳回來的數(shù)據(jù)。使用tomcat。
如何讓mina隨著tomcat啟動和銷毀?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>> 麻煩各位大神看看這是什么原因 第一次嘗試用mina做發(fā)送指令通訊,結果發(fā)現(xiàn)服務器卡死,用jmap 測試后 發(fā)現(xiàn)的
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
概述
本文演示的是一個Android客戶端程序,通過UDP協(xié)議與兩個典型的NIO框架服務端,實現(xiàn)跨平臺雙向通信的完整Demo。
當前由于NIO框架的流行,使得開發(fā)大并發(fā)、高性能的互聯(lián)網(wǎng)服務端成為可能。這其中最流行的無非就是MINA和Netty了,MINA目前的主要版本是 MINA2 、而Netty的主要版本是 Netty3 和 Netty4 (Netty5已經(jīng)被取消開發(fā)了: 詳見此文 )。
本文中,服務端將分別用MINA2和Netty4進行實現(xiàn),但在你實際的項目中服務端實現(xiàn)只需選其一就行了。本文中的Demo同時用MINA2和Netty4分別實現(xiàn)服務端的目的,是因為很多人都在糾結到底是用MINA還是Netty來實現(xiàn)高并發(fā)的Java網(wǎng)絡通信服務端,在此干脆兩個都實現(xiàn)了,就看你怎么選擇。
實際上,MINA2和Netty4的官方代碼里有UDP通信的Demo代碼,但卻不存在針對移動端(主要是Android和iOS端)的Demo,本文將演示用Android客戶端來實現(xiàn)這種跨平臺的雙向網(wǎng)絡通信。Demo中,已經(jīng)解決跨平臺通信時的常見的亂碼、數(shù)據(jù)字節(jié)異常等問題,如覺得有用,你可直接使用之。
學習交流
- 更多即時通訊技術資料: http://www.52im.net/forum.php?mod=collection&op=all
- 移動端即時通訊交流群: 215891622 推薦
《NIO框架入門》系列文章目錄
有關MINA和Netty的入門文章很多,但多數(shù)都是復制、粘貼的未經(jīng)證實的來路不明內(nèi)容,對于初次接觸的人來說,一個可以運行且編碼規(guī)范的Demo,顯然要比各種“詳解”、“深入分析”之類的要來的直接和有意義。本系列入門文章正是基于此種考慮而寫,雖無精深內(nèi)容,但至少希望對初次接觸MINA、Netty的人有所啟發(fā),起到拋磚引玉的作用。
本文是《NIO框架入門》系列文章中的第 4 篇,目錄如下: 《 NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 》 《 NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 》 《 NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰(zhàn) 》 《 NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰(zhàn) 》(本文)
本篇亮點 客戶端基于Android移動端平臺:
直接使用Android的標準UDP代碼,不依賴第3方包,且已解決與Java NIO服務端的跨平臺通信問題,是個難得的Android端實踐入門示例; 完整可執(zhí)行源碼、方便學習:
完整的Demo源碼,適合新手直接運行,便于學習和研究。 Demo中的代碼源自作者的開源工程,有實用價值:
源碼均修改自作者的即時通訊開源工程 MobileIMSDK ,只是為了方便學習理解而作了簡化,有一定的實用價值;
本文中Demo演示的功能
本文中的Demo代碼實現(xiàn)包含兩部分,Android UDP客戶端和NIO框架實現(xiàn)的服務端(包括MINA2和Netty4實現(xiàn)兩個方案),客戶端每隔5秒向服務端發(fā)送消息,而服務端在收到消息后馬上回復一條消息給客戶端。
如上所述,服務端(PC服務器)和客戶端(Android移動端)都要實現(xiàn)消息的發(fā)送和接收,即實現(xiàn)跨平臺的雙向通信。下節(jié)將將給出真正的實現(xiàn)代碼。
Android客戶端準備工作
[Step 1]:準備好開發(fā)環(huán)境
這兩年,Google官方已經(jīng)基本放棄Eclipse+ADT這樣的IDE組合,轉而大力開發(fā)Android Studio,但不得不承認,由于我的OS仍然是XP(Android Studio不支持XP),所以Eclipse+ADT還得繼續(xù)用(這個組合雖然一直被吐槽,但又不得不用)。
如果你習慣使用Eclipse+ADT這樣的IDE,可以 下載我打好包的版本 ,內(nèi)含Eclipse4.2+ADT+Android SDK:
如果你需要Android Studio, 可進入此鏈接下載 。
[Step 2]:新建一個普通的Android工程,準備開擼
本文以Eclipse+ADT為開發(fā)Android開發(fā)工具(如你使用Android Studio道理也是一樣的),按照提示新建工程即可,無需特殊的設置或其它前前置條件。
我建好的工程,如下圖所示(很多都是默認生成的,用不上的東西就別去管它了):
補充說明:因為需要進行網(wǎng)絡通信,建好的工程里,請務必在 AndroidManifest.xml 加上網(wǎng)絡權限的許可,如下圖:
Android客戶端代碼實現(xiàn)
[1] 客戶端主類 MainActivity.java: /* * Copyright (C) 2016 即時通訊網(wǎng)(52im.net) - 即時通訊開發(fā)者社區(qū). * All rights reserved. */ package net.x52im.example.android.udp; import net.x52im.example.android.udp.utils.UDPUtils; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBarActivity; import android.util.Log; /** * Demo主類。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class MainActivity extends ActionBarActivity { private final static String TAG = MainActivity.class.getSimpleName(); // 重復發(fā)送的時間間隔(單位:毫秒) public static int INTERVAL = 5000 ; private Handler handler = null ; private Runnable runnable = null ; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化本地UDP的Socket LocalUDPSocketProvider.getInstance().initSocket(); // 啟動本地UDP監(jiān)聽(接收數(shù)據(jù)用的) LocalUDPDataReciever.getInstance( this ).startup(); // 自動循環(huán)發(fā)送 handler = new Handler(); runnable = new Runnable(){ @Override public void run () { sendMessageToServer(); // 開始下一次循環(huán) handler.postDelayed(runnable, INTERVAL); } }; // 立即開始發(fā)送 handler.postDelayed(runnable, 0 ); } private void sendMessageToServer () { try { // 要發(fā)送的數(shù)據(jù) String toServer = "Hi,我是客戶端,我的時間戳" +System.currentTimeMillis(); byte [] soServerBytes = toServer.getBytes( "UTF-8" ); // 開始發(fā)送 boolean ok = UDPUtils.send(soServerBytes, soServerBytes.length); if (ok) Log.d(TAG, "發(fā)往服務端的信息已送出." ); else Log.e(TAG, "發(fā)往服務端的信息沒有成功發(fā)出?。?!" ); } catch (Exception e) { Log.w(TAG, e.getMessage(), e); } } }
補充說明: 本類沒有去寫UI代碼,只是作為本次Demo的主入口類而已,需要查看數(shù)據(jù)輸出的,請在Eclipse下的DDMS控制臺看查看log輸出哦。
[2] 客戶端本地 UDP Socket 管理類 LocalUDPSocketProvider.java: /* * Copyright (C) 2016 即時通訊網(wǎng)(52im.net) - 即時通訊開發(fā)者社區(qū). * All rights reserved. */ package net.x52im.example.android.udp; import java.net.DatagramSocket; import java.net.InetAddress; import net.x52im.example.android.udp.utils.ConfigEntity; import android.util.Log; /** * 本地 UDP Socket 管理類。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class LocalUDPSocketProvider { private static final String TAG = LocalUDPSocketProvider.class.getSimpleName(); private static LocalUDPSocketProvider instance = null ; private DatagramSocket localUDPSocket = null ; public static LocalUDPSocketProvider getInstance () { if (instance == null ) instance = new LocalUDPSocketProvider(); return instance; } public void initSocket () { try { // UDP本地監(jiān)聽端口(如果為0將表示由系統(tǒng)分配,否則使用指定端口) this .localUDPSocket = new DatagramSocket(ConfigEntity.localUDPPort); // 調(diào)用connect之后,每次send時DatagramPacket就不需要設計目標主機的ip和port了 // * 注意:connect方法一定要在DatagramSocket.receive()方法之前調(diào)用, // * 不然整send數(shù)據(jù)將會被錯誤地阻塞。這或許是官方API的bug,也或許是調(diào) // * 用規(guī)范就應該這樣,但沒有找到官方明確的說明 this .localUDPSocket.connect( InetAddress.getByName(ConfigEntity.serverIP), ConfigEntity.serverUDPPort); this .localUDPSocket.setReuseAddress( true ); Log.d(TAG, "new DatagramSocket()已成功完成." ); } catch (Exception e) { Log.w(TAG, "localUDPSocket創(chuàng)建時出錯,原因是:" + e.getMessage(), e); } } public DatagramSocket getLocalUDPSocket () { return this .localUDPSocket; } }
[3] 客戶端本地UDP端口監(jiān)聽和數(shù)據(jù)接收類 LocalUDPDataSender.java: /* * Copyright (C) 2016 即時通訊網(wǎng)(52im.net) - 即時通訊開發(fā)者社區(qū). * All rights reserved. */ package net.x52im.example.android.udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import net.x52im.example.android.udp.utils.ConfigEntity; import android.content.Context; import android.util.Log; /** * 本地UDP端口監(jiān)聽和數(shù)據(jù)接收類。 * * @author jack.jiang@52im.net, 2016-06-27 * @version 1.0 */ public class LocalUDPDataReciever { private static final String TAG = LocalUDPDataReciever.class.getSimpleName(); private static LocalUDPDataReciever instance = null ; private Thread thread = null ; private Context context = null ; public static LocalUDPDataReciever getInstance (Context context) { if (instance == null ) instance = new LocalUDPDataReciever(context); return instance; } private LocalUDPDataReciever (Context context) { this .context = context; } public void startup () { this .thread = new Thread( new Runnable() { public void run () { try { Log.d(LocalUDPDataReciever.TAG, "本地UDP端口偵聽中,端口=" + ConfigEntity.localUDPPort + "..." ); //開始偵聽 LocalUDPDataReciever. this .udpListeningImpl(); } catch (Exception eee) { Log.w(LocalUDPDataReciever.TAG, "本地UDP監(jiān)聽停止了(socket被關閉了?)," + eee.getMessage(), eee); } } }); this .thread.start(); } private void udpListeningImpl () throws Exception { while ( true ) { byte [] data = new byte [ 1024 ]; // 接收數(shù)據(jù)報的包 DatagramPacket packet = new DatagramPacket(data, data.length); DatagramSocket localUDPSocket = LocalUDPSocketProvider.getInstance().getLocalUDPSocket(); if ((localUDPSocket == null ) || (localUDPSocket.isClosed())) continue ; // 阻塞直到收到數(shù)據(jù) localUDPSocket.receive(packet); // 解析服務端發(fā)過來的數(shù)據(jù) String pFromServer = new String(packet.getData(), 0 , packet.getLength(), "UTF-8" ); Log.w(LocalUDPDataReciever.TAG, "【NOTE】>>>>>> 收到服務端的消息:" +pFromServer); } } }
補充說明:以上代碼使用的是Android的標準UDP Socket代碼,如果你對此不太熟悉請先查閱更多Android UDP通訊的相關實例。
服務端準備工作
本文將分別基于MINA2和Netty4實現(xiàn)兩套服務端(你只需要使用其中之一即可),服務端準備工作已在本系列文章的前兩篇詳細記錄了,具體如下:
- Netty4實現(xiàn)服務端的準備工作請見:《 NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 》
- MINA2實現(xiàn)服務端的準備工作請見:《 NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 》
服務端代碼實現(xiàn)
因兩套方案的服務端代碼都不復雜,且已經(jīng)本系列文章的前兩篇中詳細介紹,本文就不在重復粘貼了。
- Netty4實現(xiàn)的服務端請見:《 NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 》
- MINA2實現(xiàn)的服務端請見:《 NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 》
Demo 運行截圖
[1] Android客戶端運行結果:
[2] 服務端運行結果(MINA2方案):
[3] 服務端運行結果(Netty4方案):
本文小結
Demo中的客戶端代碼是從 開源即時通訊框架MobileIMSDK 的Android端中復制出來的(為了方便理解做了大幅簡化),有興趣的可看看 MobileIMSDK Android端 、 Server端 ,簡化一下可以用作你自已的各種用途。
本文的姊妹篇《 NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰(zhàn) 》,演示的是iOS端的跨平臺UDP雙向通信,需要的話可以看看。
對于服務端的NIO框架來說,如果你閱讀過本系列的《 NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示 》和《 NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示 》,應該能明顯地感覺的出來MINA2的UDP服務端API接口使用要是Netty4的繁瑣,而且MINA2還存在獨立客戶端(非依賴于MINA2客戶端)實現(xiàn)時的多余字節(jié)和亂碼問題。但個人認為MINA2的代碼風格更符合一般程序員的編碼習慣,更好懂一些,而Netty4因歷經(jīng)多個大版本的進化,雖起來非常簡潔,但實現(xiàn)并不是那么直觀。當然,至于MINA還是Netty,請客觀一評估和使用,因為二者并無本質(zhì)區(qū)別。
更多NIO框架資料整理
[1] MINA和Netty的源碼在線學習和查閱:
MINA-2.x地址是: http://docs.52im.net/extend/docs/src/mina2/
MINA-1.x地址是: http://docs.52im.net/extend/docs/src/mina1/
Netty-4.x地址是: http://docs.52im.net/extend/docs/src/netty4/
Netty-3.x地址是: http://docs.52im.net/extend/docs/src/netty3/
[2] MINA和Netty的API文檔在線查閱:
MINA-2.x API文檔(在線版): http://docs.52im.net/extend/docs/api/mina2/
MINA-1.x API文檔(在線版): http://docs.52im.net/extend/docs/api/mina1/
Netty-4.x API文檔(在線版): http://docs.52im.net/extend/docs/api/netty4/
Netty-3.x API文檔(在線版): http://docs.52im.net/extend/docs/api/netty3/
[3] 更多有關NIO編程的資料:
請進入精華資料專輯: http://www.52im.net/forum.php?mod=collection&action=view&ctid=9
[4] 有關IM聊天應用、消息推送技術的資料:
請進入精華資料專輯: http://www.52im.net/forum.php?mod=collection&op=all
[5] 技術交流和學習:
可直接進入 即時通訊開發(fā)者社區(qū) 討論和學習網(wǎng)絡編程、IM聊天應用、消息推送應用的開發(fā)。
完整源碼工程下載
如需完整Eclipse源碼工程請聯(lián)系作者,或者進入鏈接 http://www.52im.net/thread-388-1-1.html 自行下載。
完整源碼工程截圖如下:
截圖說明: 左右是Android客戶端源碼、右邊是服務端(MINA2和Netty4兩個方案)。
(本文同步發(fā)布于: http://www.52im.net/thread-388-1-1.html )
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
同時開啟 JFinal和mina服務器,把登錄用戶session 存入 , 在JFinal的action中根據(jù)id得到對應用戶的session并發(fā)送消息,實現(xiàn)訂單消息同步提醒, session存入成功, 但是尋找 session 返回結果為空,是線程問題?或者JFinal與mina沖突?求大神
public void send(){
boolean flag;
Indent indentBack = getModel(Indent.class);
System.out.println(indentBack);
flag = indentBack.save();
if(flag){
String[] carPark_id = new String[]{"1"};
//發(fā)送的信息
String jsonstr = "123";
SessionMap.newInstance().sendMessage(carPark_id, jsonstr);
renderJson("{\"CAllBACK_STATUS\":100}");
}else {
renderJson("{\"CAllBACK_STATUS\":-100}");
}
}
public void sendMessage(String[] keys, Object message){
IoSession session = this.getSession("1");
//logger.debug("反向發(fā)送消息到客戶端Session---key=" + key + "----------消息=" + message);
System.out.println("+++++session1"+session);
if(session == null){
return;
}
System.out.print("+++++session"+session);
session.write(message);
}
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
前幾天用了proxool,其他方面沒什么優(yōu)勢,但它有一個連接池監(jiān)控功能非常實用。進行如下簡單配置:
admin
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
admin
/admin
并在應用啟動后訪問:http://localhost:8080/myapp/admin這個url即可監(jiān)控。
鑒于此,不知道使用c3p0的牛X們,如何對c3p0進行監(jiān)控?
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
配置完成后,程序啟動時卡一段時間后,一直報如下問題:
檢查過確認不是用戶名密碼錯誤,配置文件如下:
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd"
default-lazy-init="false">
Spring datables config
org.hibernate.dialect.Oracle10gDialect
${hibernate.show_sql}
${hibernate.format_sql}
true
true
org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
net.sf.ehcache.hibernate.EhCacheProvider
${ehcache_config_file}
50
com.iris.egrant.consts.model
com.iris.egrant.security.model
com.iris.egrant.proposal.pojo.model.setting
com.iris.egrant.tableConfig.model
com.iris.egrant.component.model
jbpm.repository.hbm.xml
jbpm.execution.hbm.xml
jbpm.history.hbm.xml
jbpm.task.hbm.xml
jbpm.identity.hbm.xml
jndi 連接池
conn.jdbc.egrant=java\:/comp/env/jdbc/sun_egrant
context配置文件
name="jdbc/sun_egrant"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
maxPoolSize="3"
minPoolSize="1"
acquireIncrement="1"
maxIdleTime="120"
initialPoolSize="1"
factory="org.apache.naming.factory.BeanFactory"
user="sun_egrant_dev"
password="sun_egrant_dev"
driverClass="oracle.jdbc.driver.OracleDriver"
jdbcUrl="jdbc:oracle:thin:@192.168.15.14:1521:ora11g" />
各位大神看下是否有什么問題? HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
有沒有人知道怎么解決用c3p0連接池時會報錯:
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
Caused by: com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool
這個有會后端的大佬知道怎么解決嗎?改配置文件也不沒用。
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
配置文件的所有內(nèi)容: c3p0.jdbcUrl=jdbc:oracle:thin:@XXX.XXX.XXX.XXX:1521:ora10g c3p0.driverClass=oracle.jdbc.driver.OracleDriver c3p0.user=XXX c3p0.password=XXX c3p0.minPoolSize=3 c3p0.maxPoolSize=20 com.mchange.v2.log.MLog=com.mchange.v2.log.log4j.Log4jMLog com.mchange.v2.log.NameTransformer=com.mchange.v2.log.PackageNames com.mchange.v2.log.FallbackMLog.DEFAULT_CUTOFF_LEVEL=ALL
獲取連接代碼: ComboPooledDataSource cpds = new ComboPooledDataSource(); conn = cpds.getConnection(); 出錯信息:log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog). log4j:WARN Please initialize the log4j system properly. java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at c3p0.testc3p0.main(testc3p0.java:21) Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ... 2 more 真心求助!謝謝大家!
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
@JFinal 你好,想跟你請教個問題:正式環(huán)境發(fā)現(xiàn)c3p0的死鎖問題,查閱相關資料,想修改c3p0的設置,但是在Jfinal的c3p0插件中,只發(fā)現(xiàn)了maxPoolSize、minPoolSize、initialPoolSize、maxIdleTime、acquireIncrement這五個參數(shù),是否不能配置其它參數(shù)?
-------附帶c3p0的異常日志-------
12:13:31,948 WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner.run():624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@2804047 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 3
Active Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@13235e29 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@76fadf8f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@506b624f (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
Pending Tasks:
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3a0359c8
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@31fb7739
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@745058d1
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@46f73cff
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@11c5adbf
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@4911dfb6
com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask@34764b34
com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@42435dd4
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:562)
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
好好的就報異常了~~ 警告: com.mchange.v2.resourcepool.BasicResourcePool@8fce95 -- Thread unexpectedly interrupted while performing an acquisition attempt. java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547)
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
使用c3p0,程序會突然無法與數(shù)據(jù)庫連接,所有數(shù)據(jù)操作無法執(zhí)行,但不會報任何錯誤。而且不會恢復,只能重啟Tomcat。而且程序并沒有停止運行,不需要數(shù)據(jù)庫交互的方法還能執(zhí)行
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
一個項目通過c3p0獲得連接池,相關代碼如下: public class JdbcUtil { // 連接池的核心類 private static ComboPooledDataSource dataSource; //初始化連接池相關參數(shù) static{ try { dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(PropertiesUtil.getValue("jdbcName")); dataSource.setJdbcUrl(PropertiesUtil.getValue("dbUrl")); dataSource.setUser(PropertiesUtil.getValue("dbUserName")); dataSource.setPassword(PropertiesUtil.getValue("dbPassword")); dataSource.setInitialPoolSize(5); dataSource.setMinPoolSize(5); dataSource.setMaxPoolSize(20); // 以下兩句用于設置自動重連 dataSource.setIdleConnectionTestPeriod(10); dataSource.setTestConnectionOnCheckin(true); } catch (Exception e) { e.printStackTrace(); } } //下面是getDataSource,getConnection等方法 }
關閉Tomcat的時候提示: 警告: The web application [uavmonitor] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.util.TimerThread.mainLoop(Timer.java:552) java.util.TimerThread.run(Timer.java:505) 二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534) 二月 13, 2017 3:51:45 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads 警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
主要是這幾句:
1.
警告: The web application [uavmonitor] appears to have started a thread named [com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
2.
The web application [uavmonitor] appears to have started a thread named [Timer-0] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
java.lang.Object.wait(Native Method)
java.util.TimerThread.mainLoop(Timer.java:552)
java.util.TimerThread.run(Timer.java:505)
查詢c3p0官方文檔 http://www.mchange.com/projects/c3p0/#cleaning
說是“ c3p0 spawns a variety of Threads ( helper threads , java.util.Timer threads) ”,結合上面的出錯信息,推斷應該是Tomcat關閉的時候沒有關閉JdbcUtil類創(chuàng)建出來的c3p0的datasource。
寫了一個監(jiān)聽器 try { DataSources.destroy(JdbcUtil.getDataSource()); System.out.println("關閉數(shù)據(jù)庫連接池成功!"); } catch (SQLException e) { e.printStackTrace(); }
可以解決相關問題。
然而Tomcat關閉前清理c3p0的datasource應該是一個很常見的需求,有沒有更優(yōu)雅一點的方法來做這種清理?;蛘哒f應該在哪里配置一下,就可以讓tomcat關閉前自動destory這個datasource??
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
大家好,最近用jfinal開發(fā)了一個項目,連建池組件用的c3p0,周六周日連續(xù)跑了兩天,發(fā)現(xiàn)如下錯誤日志,
2017-01-13 22:15:08
[INFO]-[Thread: http-bio-80-exec-7]-[com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection()]: [c3p0 -- conection resource close Exception]
java.sql.SQLRecoverableException: 關閉的連接
at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5389)
at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1578)
at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563)
at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.close(OraclePreparedStatementWrapper.java:80)
at com.mchange.v2.c3p0.impl.NewPooledConnection.cleanupUncachedStatements(NewPooledConnection.java:752)
at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:401)
at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1660)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.plugin.activerecord.SqlReporter.invoke(SqlReporter.java:58)
at com.sun.proxy.$Proxy12.close(Unknown Source)
at com.jfinal.plugin.activerecord.Config.close(Config.java:222)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:325)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:334)
at com.jfinal.plugin.activerecord.Db.find(Db.java:233)
at CommonSearch.Mtcx.rzddclcxAc(Mtcx.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
2017-01-13 22:15:08
[INFO]-[Thread: http-bio-80-exec-8]-[com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection()]: [c3p0 -- conection resource close Exception]
java.sql.SQLRecoverableException: 關閉的連接
at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5389)
at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1578)
at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563)
at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.close(OraclePreparedStatementWrapper.java:80)
at com.mchange.v2.c3p0.impl.NewPooledConnection.cleanupUncachedStatements(NewPooledConnection.java:752)
at com.mchange.v2.c3p0.impl.NewPooledConnection.markClosedProxyConnection(NewPooledConnection.java:401)
at com.mchange.v2.c3p0.impl.NewProxyConnection.close(NewProxyConnection.java:1660)
at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.plugin.activerecord.SqlReporter.invoke(SqlReporter.java:58)
at com.sun.proxy.$Proxy12.close(Unknown Source)
at com.jfinal.plugin.activerecord.Config.close(Config.java:222)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:325)
at com.jfinal.plugin.activerecord.DbPro.findFirst(DbPro.java:353)
at com.jfinal.plugin.activerecord.Db.findFirst(Db.java:251)
at com.qqctweb.function.Customer.login(Customer.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
2017-01-13 22:15:08
[ERROR]-[Thread: http-bio-80-exec-7]-[com.jfinal.core.ActionHandler.handle()]: /mtcx/rzddclcxAc?_dc=1484316909006&page=1&start=0&limit=5&jsonPCallback=Ext.data.JsonP.callback2
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLRecoverableException: IO 錯誤: Connection reset by peer: socket write error
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:323)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:334)
at com.jfinal.plugin.activerecord.Db.find(Db.java:233)
at CommonSearch.Mtcx.rzddclcxAc(Mtcx.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLRecoverableException: IO 錯誤: Connection reset by peer: socket write error
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:897)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:248)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:308)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:321)
... 29 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at oracle.net.ns.DataPacket.send(DataPacket.java:210)
at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
... 37 more
2017-01-13 22:15:08
[ERROR]-[Thread: http-bio-80-exec-8]-[com.jfinal.core.ActionHandler.handle()]: /customer/login?_dc=1484316908936&code=irxahxngks&page=1&start=0&limit=25&jsonPCallback=Ext.data.JsonP.callback1
com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLRecoverableException: IO 錯誤: Connection reset by peer: socket write error
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:323)
at com.jfinal.plugin.activerecord.DbPro.findFirst(DbPro.java:353)
at com.jfinal.plugin.activerecord.Db.findFirst(Db.java:251)
at com.qqctweb.function.Customer.login(Customer.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:55)
at com.jfinal.ext.interceptor.SessionInViewInterceptor.intercept(SessionInViewInterceptor.java:44)
at com.jfinal.core.ActionInvocation.invoke(ActionInvocation.java:51)
at com.jfinal.core.ActionHandler.handle(ActionHandler.java:73)
at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:72)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLRecoverableException: IO 錯誤: Connection reset by peer: socket write error
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:897)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:248)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:308)
at com.jfinal.plugin.activerecord.DbPro.find(DbPro.java:321)
... 29 more
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at oracle.net.ns.DataPacket.send(DataPacket.java:210)
at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
... 37 more
當訪問失敗時,服務器報出如上錯誤,一段時間無訪問時報出如下錯誤
2017-01-13 22:48:24
[INFO]-[Thread: C3P0PooledConnectionPoolManager[identityToken->1bqq1on9l15wq40humk8vk|1d72b61]-HelperThread-#0]-[com.mchange.v2.c3p0.impl.NewPooledConnection.logCloseExceptions()]: [c3p0] Exceptions occurred while trying to close a PooledConnection's resources normally.
2017-01-13 22:48:24
[INFO]-[Thread: C3P0PooledConnectionPoolManager[identityToken->1bqq1on9l15wq40humk8vk|1d72b61]-HelperThread-#0]-[com.mchange.v2.c3p0.impl.NewPooledConnection.logCloseExceptions()]: [c3p0] NewPooledConnection close Exception.
java.sql.SQLRecoverableException: IO 錯誤: Connection reset by peer: socket write error
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:556)
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3984)
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:642)
at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:255)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:621)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1024)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at oracle.net.ns.DataPacket.send(DataPacket.java:210)
at oracle.net.ns.NetOutputStream.flush(NetOutputStream.java:230)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:312)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61)
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:543)
... 6 more
2017-01-13 22:48:24
[WARN]-[Thread: C3P0PooledConnectionPoolManager[identityToken->1bqq1on9l15wq40humk8vk|1d72b61]-HelperThread-#2]-[com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run()]: Failed to destroy resource: com.mchange.v2.c3p0.impl.NewPooledConnection@1f7fc32
java.sql.SQLException: Some resources failed to close properly while closing com.mchange.v2.c3p0.impl.NewPooledConnection@1f7fc32
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:664)
at com.mchange.v2.c3p0.impl.NewPooledConnection.closeMaybeCheckedOut(NewPooledConnection.java:255)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:621)
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:1024)
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:696)
因為測試期間基本就我一個人偶爾訪問,連接數(shù)不可能超限,跟蹤oracle中的連接情況,該項目最低維持2個瘦連接,最多時也只有8個,當連接被創(chuàng)建后,可以復用,但連接空閑時并未按照我配置的空閑保持時間斷開,而是一直保持連接,過了許久才斷開。
下面貼出c3p0的配置
int maxPoolSize = 26;//最多保持X個數(shù)據(jù)庫連接
int minPoolSize = 2;//始終保持至少X個數(shù)據(jù)庫連接
int initialPoolSize = 2;//第一次啟動創(chuàng)建X個數(shù)據(jù)庫連接
int maxIdleTime = 10;//當連接空閑時最多保持X秒再斷開
int acquireIncrement = 2;//當需要創(chuàng)建新連接時,一次性創(chuàng)建X
HDC調(diào)試需求開發(fā)(15萬預算),能者速來!>>>
我的框架是Spring沒有使用hibernate,數(shù)據(jù)庫連接使用的是c3p0最新版本:c3p0-0.9.5.2.jar同時與oracle相關jar包c3p0-oracle-thin-extras-0.9.5.2.jar已導入,mchange-commons-java-0.2.11.jar也導入,調(diào)用oracle存儲過程,如果傳入?yún)?shù)是字符串沒問題,可以正常連接數(shù)據(jù)庫并正常調(diào)用,但是傳入的是List在list與oracle類型轉換的時候報錯:com.mchange.v2.c3p0.impl.NewProxyConnection cannot be cast to oracle.jdbc.OracleConnection
報錯的語句:StructDescriptor structdesc = StructDescriptor.createDescriptor(oracleObj, conn);
這是oracle.sql.StructDescriptor里面的構造函數(shù)
但是在spring使用自帶的dataSource配置:
是沒問題的,使用