From: Noredine B. <nbe...@ya...> - 2006-04-13 13:11:23
|
Hi everyone, I've got a problem with my application (on Fedora core 4, postgresql serveur 8.0.7, postgis 1.1.1), I launch a periodic task with the Java Object TimerTask every two seconds, to change the style of the visible objects of the visible layer. The color change to green to red, and the next time red to green. The problem is that at each change of style, my application open one or more a connection to the server and never close it, then after a while a java exception appears "too many clients connected". How can I manage the connections? The problem is that I don't know how to get the Connection wich it used by the FeatureSource, in order to close it after working. Thanx for all this the code that I use to connect to the server, I store the layer in a Vector: //the connection parameters-> String database; String namespace =(String)params.get("namespace"); String host = (String)params.get("host"); int port = ((Integer)params.get("port")).intValue(); String dbname = (String)params.get("database"); String schema = (String)params.get("schema"); String user = (String)params.get("user"); String password =(String)params.get("password"); factory = new PostgisConnectionFactory(host, port, dbname); JDBCDataStoreConfig config = JDBCDataStoreConfig.createWithNameSpaceAndSchemaName( namespace, schema ); //new connectionPool-> pool = factory.getConnectionPool(user, password); //new DataStore-> pgDatastore = new PostgisDataStore(pool, config, PostgisDataStore.OPTIMIZE_SAFE); m_vect_feature_source = new Vector(); FeatureSource fsRoads = pgDatastore.getFeatureSource("roads"); FeatureSource fsStreams = pgDatastore.getFeatureSource("streams"); FeatureSource fsBugs = pgDatastore.getFeatureSource("bugsites"); FeatureSource fsArch = pgDatastore.getFeatureSource("archsites"); FeatureSource fsRestricted = pgDatastore.getFeatureSource("rstrct"); m_vect_feature_source.add(fsRoads); m_vect_feature_source.add(fsStreams); m_vect_feature_source.add(fsBugs); m_vect_feature_source.add(fsArch); m_vect_feature_source.add(fsRestricted); Here is the code that the periodic task uses : //first I store the visible object in a FeatureResults with a Filter ...(too long) //storage of the identifier in a Vector, and swap of the color -> FeatureResults fr = fsRestricted.getFeatures(filt); if (fr.getCount() == 0) { System.out.println("No feature selected."); }else{ FeatureReader reader = fr.reader(); Feature f = null; Vector vec_ident_feature = new Vector(); while (reader.hasNext()) { f = (Feature) reader.next(); vec_ident_feature.add(f.getAttribute(0)); } FeatureType ft_typ = f.getFeatureType() ; if(state==1) setColorOnDeterminedFeature(ft_typ, ft_typ.getAttributeType(0).getName(), defaultStyle,vec_ident_feature,colorTrue,colorFalse); else setColorOnDeterminedFeature(ft_typ, ft_typ.getAttributeType(0).getName(), defaultStyle,vec_ident_feature,colorFalse,colorTrue); state = 1 - state; } Finally the function that applicates a style on the selected objects : GeometryAttributeType l_geom_attrib_type = ft_type_source.getDefaultGeometry(); StyleBuilder sb = new StyleBuilder(); Style mapStyle = null; Style mapStyle_2 = null; Long l_val; long val_orig, val_calc; try { StyleFactory styleFactory = StyleFactory.createStyleFactory(); mapStyle = styleFactory.createStyle(); //the "true Style" depends of true Color Mark markTrue = sb.createMark(StyleBuilder.MARK_CIRCLE, colorTrue, colorFalse, 1); Graphic graphicsTrue = sb.createGraphic(null, markTrue, null); PointSymbolizer pointTrue= sb.createPointSymbolizer(graphicsTrue); //the "false Style" depends of False Color Mark markFalse = sb.createMark(StyleBuilder.MARK_CIRCLE, colorFalse, colorTrue, 1); Graphic graphicFalse = sb.createGraphic(null, markFalse, null); PointSymbolizer pointFalse= sb.createPointSymbolizer(graphicFalse); FilterFactory filterFactory = FilterFactory.createFilterFactory(); CompareFilter filter = null; FeatureTypeStyle fts = null; Rule rule_other; //the object with a pair ID is painted with True color, the others with False color for(int i=0;i<vec_ident_feature.size();i++) { try { filter = filterFactory.createCompareFilter(CompareFilter.COMPARE_EQUALS); filter.addLeftValue(filterFactory.createAttributeExpression(ft_type_source,ft_ident)); l_val = (Long)vec_ident_feature.get(i); val_orig = l_val.longValue(); val_calc= (val_orig/2)*2; filter.addRightValue(filterFactory.createLiteralExpression(val_orig)); if(val_orig==val_calc) { rule_other =sb.createRule(pointTrue); }else{ rule_other = sb.createRule(pointFalse); } rule_other.setFilter(filter); if(fts==null) fts =sb.createFeatureTypeStyle(null, rule_other); else fts.addRule(rule_other); } catch (IllegalFilterException e) { e.printStackTrace(); } } //set the style to the specified layer Style sty =styleFactory.createStyle(); sty.addFeatureTypeStyle(fts); m_map_layer.setStyle(sty); } catch( Exception e ) { e.printStackTrace(); } ___________________________________________________________________________ Faites de Yahoo! votre page d'accueil sur le web pour retrouver directement vos services préférés : vérifiez vos nouveaux mails, lancez vos recherches et suivez l'actualité en temps réel. Rendez-vous sur http://fr.yahoo.com/set |